コンパイラかく語りき

import { Fun } from 'programming'

【Python】リスト内包表記 x 多重ループ

Python初心者です。

内包表記、とっても便利ですね。ただ、内包表記の中で多重ループすると頭が混乱してしまうので、ちょっと整理します。

 

まずは2重ループについて。以下にコード例を貼ります。

gist03b6f1b907bd5c0e8c3bb3bee3657bb1

なるほど。

最初のforがいわゆる外側のループで、次のforが内側のループですね。

 

これは、2重のループを回して、結果として1つのリストを生成していますね。

 

次にこちらの2重ループの例。

gist1a66e3010d49cdac474db6f2bc1e8e25

 

なるほど。この順番だと、最初のforが内側のループで、次のforが外側になるんですね。

要は、

[A for y in range(1, 10)]

で、Aに別の内包表記(この場合は[x * y for x in 'aaa'])がきてるんですね。と考えると理解できる。

 

じゃあ、最初の例の

[a + str(i) for i in range(4) for a in 'abc']

はどう理解すればいいのでしょうか。

 

for i in range(4)

  for a in 'abc'

    a + str(i)

 

と理解すればいいみたいです。ふむ。。

後置ifならぬ、後置forだと考えれば納得行きそうです。

 

では、内包表記をネストしつつ、その中で複数ループをしてみます。

gistae6aee8b0679ffc751e899806ddab1ed

まったく実用性のない処理ですが、上記の例は、2つのループをもつ内包表記を3つネストさせています。

 

そして、すべての文字が一致したときのみ、リストに格納します。

f:id:chuck0523:20160604001643p:plain

結果はこのとおり!

 

ここで大切なのは、外側の内包表記のループの要素は、内側の内包表記で参照可能だということですね。

一番外側の内包表記で定義?したz1とz2は一番内側の内包表記で使用可能です。

 

 

内包表記×多重ループ、それとなく分かって来ました。

 

参考文献

d.hatena.ne.jp

qiita.com