リストを生成するための表記方法。リストに対して繰り返し処理を行う場合にも使用出来る。従来の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]