リストを生成するための表記方法。リストに対して繰り返し処理を行う場合にも使用出来る。従来のmap, filterの代わりになる。だいたいの場合for文でループするよりも高速に動作する。
繰り返し処理でリスト生成する時の構文
>>> aray = [1, 2, 3]
>>> [x*2 for x in ary] #aryの各要素を*2してリストを生成する。
[2, 4, 6]
>> ary
[1, 2, 3] #aryに変更はない
リスト内包表記をfor文を使わない同等の記述
記述すると以下のようになる。(ただしこの処理の場合Pythonインタプリタで処理するのでリスト内包表記よりも低速。リスト内包表記は構文からcライブラリで処理するのでより高速に生成することができる。)
>>> ary = [1,2,3]
>>> newary = []
>>> for x in ary:
... newary.append(x*2)
...
>>> newary
[2, 4, 6]
mapとlamda式での同等の記述
mapとlambda式でも同様の処理が簡潔に記述できるが、リスト内包表記よりもおおむね低速。(forよりは速い)
>>> ary = [1,2,3]
>>> map(lambda x: x*2, ary)
[2, 4, 6]
リスト内包表記でのif
リスト内包表記ではif文で条件にマッチしたものだけ抽出することもできる。(filter相当)
>>> ary = [1,2,3]
>>> [x for x in ary if x % 2 == 1] # 奇数である要素(x % 2 == 1)を抽出したリストを作る。
[1, 3]
#filterを使った同等のコード
>>> ary = [1,2,3]
>>> filter(lambda x:x%2==1, ary) #lambda式がTrueを返す要素を抽出したリストを作る
[1, 3]
#リスト内包表記の方が、抽出した上で演算できるので応用範囲が広い
>>> ary = [1,2,3]
>>> [x*2 for x in ary if x % 2 == 1] # 奇数を抽出し、*2したリストを作る。
[2, 6]
#filterとmapを使った同等のコード(分かりにくい)
>>> map(lambda x:x*2, filter(lambda x: x%2==1, ary))
[2, 6]
ネストした表記
>>> [(x,y) for x in range(3) for y in range(3,6)]
[(0, 3), (0, 4), (0, 5), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
>>> [x*y for x in range(3) for y in range(3,6)]
[0, 0, 0, 3, 4, 5, 6, 8, 10]
# ※for文での同等のコード
>>> newary = []
>>> for x in range(3):
... for y in range(3,6):
... newary.append(x*y)
...
>>> newary
[0, 0, 0, 3, 4, 5, 6, 8, 10]