Pythonのリストの多重内包表記とfor文の処理の順番について

Pythonのリスト内包表記中の複数のfor文とその処理の順番についての解説

今回は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文の順番が逆になっていますね。これが両者の結果の違いとなって現れます。

このようにリスト内包表記の中でさらに内包表記を使っている場合(いわば多重内包表記)は、単なる内包表記とは処理の順番が異なることがあるので見た目の違いを見落とさないようにしたいですね。

最速でプログラミングをマスターするならTechAcademy [テックアカデミー] がオススメです。

マイペースで学ぶなら世界最大級の動画学習サイトUdemyがオススメです。セールで安く買える講座も多数!