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

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回答

1223閲覧

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 00:56

前提・実現したいこと

Pythonの初歩の質問で恐縮です。。
Pycharmを使ってPythonの練習をしています。
①がやりたいことなんですが、②でエラー、③で意図せぬ結果が出てしまう理由が理解できません。
②はインデントの位置がおかしいということですが、①と同じように思えます。。
また③に関しては、なぜ初めからdeckに引数を入れてはいけないのでしょうか?
よろしくお願いします

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


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"]:
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/ツールのバージョンなど)

ありません。

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

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

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

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

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

guest

回答3

0

ちょっと外した回答かと思いますが、参考までに。

多重ループは読みづらく、処理速度も遅くなりがちなのでPythonでは多用されません。
二つのリストの全ての組み合わせ、つまり直積を取りたい場合はitertools.productを使います。

Python

1from itertools import product 2 3deck = list( 4 product(range(1, 10), ['S', 'H', 'D']) 5) 6print(*deck, sep='\n')

実行結果 Wandbox

for文をこねくり回すのも勉強のプロセスとして非常に重要です。
しかし、このように簡潔に書く方法があるのだということも知っておいてください。

投稿2018/02/12 05:30

LouiS0616

総合スコア35660

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

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

python365

2018/02/12 23:41

ありがとうございます。参考にさせて頂きます!
guest

0

0) ①がやりたいことなんですが、②でエラー、③で意図せぬ結果が出てしまう理由が理解できません。

 ②のコードと③のコードは、forの範囲などが共通していますが、①のコードとはforの範囲が異なる、deck.appendは①にしかない等の相違があります。
そのため、②や③が、①と同じ動作することを意図して書かれたとは思えません。
ほんとに実現したい動作は、どのようなものなのでしょうか?
この回答が的外れだとしたら、どのように結果が出力されるプログラムを作ろうとしていらっしゃるのかを質問に書いてください。

1) ②はインデントの位置がおかしいということですが、①と同じように思えます。。
3つのコードは、どれもインデント(コードの先頭にスペース(空白文字)を入れて、コードの始まる位置を変えること。日本語では"字下げ"という)がされていません。①も②もインデントがされていないので(どちらも間違いなので)、同じように思えたとしても無意味です。

 pythonはfor,ifなどの制御文の対象範囲をインデントの深さ(先頭のスペースの文字数)で指定するプログラム言語ですから、適切にインデントすることはプログラムを書く上で重要です。({}で囲まれた内部が対象範囲になるC言語などとは、かなり見た目が異なるプログラムになります)

 ①のコードを正しくインデントし、対象範囲についてのコメント(#の右側に書く)を付け加えたのが以下です。

Python

1deck = [] 2for i in range(1, 10): 3 # ここから for i in range(1, 10)の対象範囲 4 for j in ["S", "H", "D"]: 5 # ここから for j in ["S", "H", "D"] の対象範囲 6 deck.append((i, j)) 7 8# ここから forの対象範囲ではない 9print(deck)

そして、出力結果は以下のようになります。これが①のコードで期待しているものではないかと推測します。

[(1, 'S'), (1, 'H'), (1, 'D'), (2, 'S'), (2, 'H'), (2, 'D'), (3, 'S'), (3, 'H'), (3, 'D'), (4, 'S'), (4, 'H'), (4, 'D'), (5, 'S'), (5, 'H'), (5, 'D'), (6, 'S'), (6, 'H'), (6, 'D'), (7, 'S'), (7, 'H'), (7, 'D'), (8, 'S'), (8, 'H'), (8, 'D'), (9, 'S'), (9, 'H'), (9, 'D')]

2) また③に関しては、なぜ初めからdeckに引数を入れてはいけないのでしょうか?
③のコードを正しくインデントして、printでiとjの値も出力したコードとその出力結果を示します。

Python

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

1 a ['i', 'j']

1 b ['i', 'j']
2 a ['i', 'j']
2 b ['i', 'j']
3 a ['i', 'j']
3 b ['i', 'j']

i,jの値を見ると、ちゃんと入れ子になったforが正しく実行されていることが分かります。
deckの値は、最初の行で設定しただけですから、何度printしても同じ値( ['i', 'j'])です。

プログラムのどこで値を設定すべきかは、プログラムで何がしたいのか次第ですから決まりはありません(決められません)。
2つの出力結果を比較すると、①のdeckは"整数と文字列のタプル"のリスト、③のdeckは文字列のリストです。
deckに初期値を設定するとかという問題ではなく、②、③と、①が全く違うプログラムだというところに問題(混乱)があるのではないでしょうか。

投稿2018/02/12 02:22

coco_bauer

総合スコア6915

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

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

python365

2018/02/12 02:34

詳しいご説明をして下さりありがとうございます。 私が質問欄の投稿の仕方がよくわかっておらず、インデントしたものがプレビューに反映されていませんでした。。 改めて質問させて頂きますので、もしお時間ありましたら、お助け頂けたらありがたいです。
guest

0

ベストアンサー

pythonがインデントによって構文解析をしていることをご存知でしょうか?

公式ドキュメントによると

インデントレベルは、実行文のグループ化方法を決定するために用いられます。

つまりforループの中の処理であることを示すためには、その処理をfor文より内側に(右側に)入れ子にすることがルールです。

python3

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

1がやりたい事とありますが、すみませんよくわかりません。
この場合は「S、H、Dが入ったリストに対して数字を添加したい。期待する出力は[[1,S],[2,H],[3,d]]です」とか、「S,H,dのリストが×10個欲しい」とか言って下さるともっと明快な回答つくと思います。

そして失礼ですが・・・2と3は全く同じに見えます。もし正しいインデントの入れ方を既に習得されているのでしたら、それを反映した形で質問文を掲載されてみてはいかがでしょうか?

投稿2018/02/12 01:39

rinren

総合スコア107

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

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

python365

2018/02/12 02:17

大変失礼いたしました。。 インデントが反映されていませんでした。 質問しなおしますので、もしよろしければ、お付き合い頂けたらありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問