今回はPythonのリスト内包表記の中で、複数のfor文が使われた場合の各for文の処理の順番についての簡単な解説です。内包表記は慣れておくととても便利なので今回の記事が参考になればと思います。
コード例
まずリスト内包表記を使った次の2つのコードを見てください。
list_one = [x*y for x in [1,2,3] for y in [1,10,100 ]]
list_two = [[x*y for x in [1,2,3]] for y in [1,10,100 ]]
それぞれの右辺における見た目の違いは、
- x*y for x in [1,2,3]
- [x*y for x in [1,2,3]]
だけです。list_twoのほうは、内包表記の中にさらに内包表記が入っているという点がポイントです。
それぞれの結果を見ていきましょう。まず最初の、
list_one = [x*y for x in [1, 2, 3] for y in [1, 10, 100 ]]
の結果は、
[1, 10, 100, 2, 20, 200, 3, 30, 300]
次に、
list_two = [[x*y for x in [1, 2, 3]] for y in [1, 10, 100 ]]
の結果は、
[[1, 2, 3], [10, 20, 30], [100, 200,
300]]
となります。
なぜこのような違いになるかを見ていきましょう。
解説
上述のコード例とその結果でもう気づいているかもしれませんが、
[x*y for x in [1, 2, 3] for y in [1, 10, 100]]
この形の場合は、
list_one=[]
for x in [1,2,3]:
for y in [1,10,100]:
list_one.append(x*y)
print(list_one)
と同じです。
この場合は内包表記中のfor文が出てくる登場順と、for文の構造が一致しています。
一方で、
[[x*y for x in [1, 2, 3] for y in [1, 10, 100]]
こうした場合は、
list_two=[]
for y in [1, 10, 100]:
list_two.append([x*y for x in [1, 2, 3]])
もしくは、
list_two=[]
for y in [1,10,100]:
inner_list=[]
for x in [1, 2, 3]:
inner_list.append(x*y)
list_two.append(inner_list)
と同じことになります。
どちらにしろ「for y in [1, 10, 100]」が最初に来ている点に注意しましょう。list_oneとはfor文の順番が逆になっていますね。これが両者の結果の違いとなって現れます。
このようにリスト内包表記の中でさらに内包表記を使っている場合(いわば多重内包表記)は、単なる内包表記とは処理の順番が異なることがあるので見た目の違いを見落とさないようにしたいですね。
ˇ
世界最大の動画学習サイトUdemyのおすすめPython講座【PR】
- AWSで作るWEBアプリケーション 実践講座
- 現役シリコンバレーエンジニアが教えるPython
3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
- 独学で身につけるPython〜基礎編〜【業務効率化・自動化で残業を無くそう!】
- 【完全初心者向け】絶対に挫折させないPython入門講座
- 【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門
- はじめてのPython 少しずつ丁寧に学ぶプログラミング言語Python3のエッセンス
- 【世界で55万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
- 現役シリコンバレーエンジニアが教えるアルゴリズム・データ構造・コーディングテスト入門