質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Python

    7894questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6310questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Pythonリストについてお願いします。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 194

python365

score 13

 前提・実現したいこと

Pythonの初歩の質問で恐縮です。。
トランプの52枚のカードをリストに作りたくて、①が正しいコードとされているのですが、②でエラー、③で意図せぬ結果が出てしまう理由が理解できません。
②はインデントの位置がおかしいということですが、①と同じように思えます。。
deck=[]で最初から引数を入れてはいけないのでしょうか?
また③に関しては、なぜi,jのリストが6つでてくるのかが理解できません。
よろしくお願いします。

 発生している問題・エラーメッセージ


IndentationError: expected an indented block


['i', 'j']
['i', 'j']
['i', 'j']
['i', 'j']
['i', 'j']
['i', 'j']

 該当のソースコード

deck = []
for i in range(1, 10):
    for j in ["S", "H", "D","C"]:
        deck.append((i, j))
print(deck)


deck = ["i","j"]
for i in range(1, 4):
    for j in ["a", "b"]:
print(deck)

deck = ["i","j"]
for i in range(1, 4):
    for j in ["a", "b"]:
        print(deck)

 試したこと

書籍等を調べましたが、見つけることが出来ませんでした。

 補足情報(FW/ツールのバージョンなど)

ありません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+5

2
for文の後はインデントブロックが必要です。
何も書かないのならpassを書けば良いです。

for i in range(3):
    pass

3
range(1,4)で3回、かけることの、['a','b']で2回、でトータルで6回にfor文が回っています。

for i in range(1, 4):
    for j in ['a', 'b']:
        print(i, j)

'''
1 a
1 b
2 a
2 b
3 a
3 b
'''

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/13 23:56

    ご解説ありがとうございます。
    勉強になりました。

    キャンセル

checkベストアンサー

+3

①の各行の後に何をしているかコメントを書いておきます。

deck = []#deckという空のリストを準備
for i in range(1, 10):#iを1~10の順に繰り返す
    for j in ["S", "H", "D","C"]:#jをS,H,D,Cの順に繰り返す
        deck.append((i, j))#リストに(i,j)を加える
print(deck)#forループ文iが終わったら、リストdeckを表示


①はまず、
i=1、j=Sなので、(1,S)をリストに加える。
i=1、j=Hなので、(1,H)をリストに加える。
i=1、j=Dなので、(1,D)をリストに加える。
i=1、j=Cなので、(1,C)をリストに加える。
と繰り返されて、そのあと、
i=2、j=Sなので、(2,S)をリストに加える。
i=2、j=Hなので、(2,H)をリストに加える。
i=2、j=Dなので、(2,D)をリストに加える。
i=2、j=Cなので、(2,C)をリストに加える。
とiが順番に増えていきます。
そして、i=9、j=Cまでリストに加えて、
最後にリストdeckを表示しています。

Pythonはインデント(字下げ)でどこまでがForループ文かを判断します。
②はprint(deck)のインデントが一番前に来ているので、Forループ文に組み込まれていません。
つまり、Pythonは
「『繰り返しなさい』とは命令されていますが、何を繰り返せばいいのか分かりません」
と言ってエラーを起こしています。

③はprint(deck)のインデントが2つ後ろに来ているので、Forループ文(j)に組み込まれています。
しかし、deck.append((i, j))という行を抜かすと、リストには新しく何も加えられないので、
最初に設定したdeck = ["i","j"]がprintされることになります。
i=1、j=a、のとき、リストdeckを表示
i=1、j=b、のとき、リストdeckを表示
i=2、j=a、のとき、リストdeckを表示
i=2、j=b、のとき、リストdeckを表示
i=3、j=a、のとき、リストdeckを表示
i=3、j=b、のとき、リストdeckを表示
と計6回リストdeckが表示されています。

ちなみに、最初に設定したdeck = ["i","j"]は""の中にiとjを書いているので、
変数ではなく文字として認識されています。
変数としてi,jを使いたければ""を外します。
しかしながら、

deck = [i,j]
for i in range(1, 4):
    for j in ["a", "b"]:
        print(deck)


とすると、「変数i,jに何を代入して良いか、わかりません」というエラーが発生します。
i,jという変数を使いたければ、まず、変数に何を入れるのかを命令してください。
なので、Forループ文の中にリストを組み込む必要があります。

for i in range(1, 4):
    for j in ["a", "b"]:
        deck = [i,j]
        print(deck)


と書くと、表示結果は
[1, 'a']
[1, 'b']
[2, 'a']
[2, 'b']
[3, 'a']
[3, 'b']
となります。deck.appendではないので、リストdeckに[i,j]を加えているのではなく、
リストdeckを毎回書き直して、表示している状態です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/13 23:54

    詳しいご説明ありがとうございます。
    何が分かっていないかを正確に把握できていない状態の私に、質問させて頂いた以上のことを捕捉でご解説頂けたのは、とてもありがたく勉強になりました。
    ありがとうございました。

    キャンセル

+1

②は

deck = ["i","j"]
for i in range(1, 4):
    for j in ["a", "b"]: #この処理は上のループ文より内側なので、上のfor i in range(1, 4):グループの配下にある
    #でもここに何もないからエラー
print(deck) #この処理はループの外なので一度だけ実行される

③は

deck = ["i","j"] #←ここでリストを作った後一度も操作していない
for i in range(1, 4): #グループ配下を3回繰り返す、(実際にrange関数は1、2、3という数字を生成するので、3回)
    for j in ["a", "b"]: #グループ配下を2回繰り返す(実際にはリスト["a", "b]の中身を取り出している。2個入ってるから、2回)
        print(deck) #一度も操作していないdeck を計6回出力

deck=[]で最初から引数を入れてはいけないのでしょうか?

いいえ。問題ありません。

なぜi,jのリストが6つでてくるのかが理解できません。

for文とインデント、この二つの知識が必要です

もっとちゃんと知りたい場合は、こちらをご覧ください。
forの公式解説ドキュメント

インデントの公式解説ドキュメント

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/13 23:51

    詳しいご説明ありがとうございます。
    とても助かりました、ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7894questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6310questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。