
Pythonの入れ子のリスト内包を、ほぼサンプルプログラムの変化だけで示してみる。。。
まずリスト内包の基礎がまだの人は、先に下記の記事を読んでください。
https://note.com/0_humpty_dumpty/n/n3544cba4059c
では、リスト内包の基礎が分かってるものとして、ほぼサンプルプログラムの変化だけで、入れ子のリスト内包の基礎を示して行きます。
まず、下記の入れ子のリスト
[[0], [0, 1], [0, 1, 2]]
を作成する通常のサンプルプログラムを示します。
l = []
for y in range(3):
t = []
for x in range(y + 1):
t.append(x)
l.append(t)
print(l)
次に、内側の子ループだけをリスト内包に変えたサンプルプログラムを示します。このリスト内包に変えた部分が、入れ子のリスト内包の for 句より左の括弧の中の式になります。
l = []
for y in range(3):
l.append([x for x in range(y + 1)])
print(l)
次に、外側の親ループもリスト内包に変えたサンプルプログラムを示します。これで入れ子のリスト内包が完成です。
l = []
l = [[x for x in range(y + 1)] for y in range(3)]
print(l)
まとめ
入れ子のリスト内包の肝は、親ループと子ループの位置関係だと思います。子ループが、入れ子のリスト内包の for 句より左の括弧の中の式になる事を理解する事が始めの一歩です。
おまけで、全てを一行にまとめたサンプルプログラムを示しておきます。
print([[x for x in range(y + 1)] for y in range(3)])