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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

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

Python 3.x

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

Python

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

Q&A

解決済

3回答

1125閲覧

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

python365

総合スコア31

Python 2.7

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/02/12 23:37

前提・実現したいこと

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

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


IndentationError: expected an indented block


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

該当のソースコード

Python

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

python

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

Python

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

試したこと

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

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

ありません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

python

1for i in range(3): 2 pass

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

python

1for i in range(1, 4): 2 for j in ['a', 'b']: 3 print(i, j) 4 5''' 61 a 71 b 82 a 92 b 103 a 113 b 12'''

投稿2018/02/13 00:18

編集2018/02/13 00:51
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python365

2018/02/13 14:56

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

0

ベストアンサー

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

Python

1deck = []#deckという空のリストを準備 2for i in range(1, 10):#iを1~10の順に繰り返す 3 for j in ["S", "H", "D","C"]:#jをS,H,D,Cの順に繰り返す 4 deck.append((i, j))#リストに(i,j)を加える 5print(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を使いたければ""を外します。
しかしながら、

Python

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

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

Python

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

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

投稿2018/02/13 01:13

編集2018/02/13 01:26
84zero

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python365

2018/02/13 14:54

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

0

②は

python

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

③は

python

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

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

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

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

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

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

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

投稿2018/02/13 02:59

rinren

総合スコア107

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python365

2018/02/13 14:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問