Python - リスト内包表記

公開日:2019-03-12 更新日:2019-05-14
[Python]

1. 概要

リスト内包表記の使い方です。
リスト内包表記を使うと、加工や絞り込みを行った新しいリストを簡単に作成することができます。

2. 値の加工

リストの各値を2倍にした新しいリストを生成します。

lst = [1, 2, 3, 4, 5]

print( [ v * 2 for v in lst ] )
[2, 4, 6, 8, 10]

range() を使って以下のように書くこともできます。
print( [ v * 2 for v in range(1, 6) ] )

3. 値の絞り込み

for の後ろに if を付けて、値の絞り込みを行うことができます。

lst = range(1, 11)

print( list(lst) )
print( [v for v in lst if v <= 5] )
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]

4. 2重ループ

for を2回つけて、2重ループにすることができます。
作成されるリストの要素は3つの値を持つタプルにしていますが、2重ループにしたからと言って、結果をタプルにする必要はありません。

#掛け算の九九
list1 = range(1, 10)
list2 = range(1, 10)

list3 = [(v1, v2, v1*v2) for v1 in list1 for v2 in list2]

for item in list3:
	print(str(item[0]) + " * " + str(item[1]) + " = " + str(item[2]))
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3

(省略)

9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

上記の内包表記は、以下のように for の2重ループと同じです。
for v1 in list1:
	for v2 in list2:
		print(str(v1) + " * " + str(v2) + " = " + str(v1 * v2))

5. サンプル - 競馬の枠連の全組み合わせ

for の2重ループで全組み合わせを作成し、
if でゾロ目を残しつつ片方の組み合わせを抽出しています。

list1 = range(1, 9)
list2 = range(1, 9)

list3 = [(v1, v2) for v1 in list1 for v2 in list2 if v1 <= v2]
print( list3 )
print( len(list3) )
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), 
(2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), 
(3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), 
(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), 
(5, 5), (5, 6), (5, 7), (5, 8), 
(6, 6), (6, 7), (6, 8),
(7, 7), (7, 8),
(8, 8)]
36

6. サンプル - 競馬の3連単の組み合わせ

list1、list2、list3 の値が重複しない組み合わせのリストを作成します。
for の3重ループで全ての組み合わせをループし、
「if v1 != v2 != v3 != v1」で重複を省いています。
最後に「!= v1」 をつけないと、v3 との評価ができないので要注意。

list1 = [1,2]
list2 = [1,2,3]
list3 = [3,4,5,6,7,8]

list4 = [(v1,v2,v3) for v1 in list1 for v2 in list2 for v3 in list3 if v1 != v2 != v3 != v1]

print( list4) 
print( len(list4) )
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 2, 7), (1, 2, 8), 
(1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 3, 7), (1, 3, 8), 
(2, 1, 3), (2, 1, 4), (2, 1, 5), (2, 1, 6), (2, 1, 7), (2, 1, 8), 
(2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 3, 7), (2, 3, 8)]
22