リスト内包表記はリストを生成するシンプルな手段を提供します。
基本的な構文
最も基本的な使い方は、通常のfor文によるリスト生成を簡潔に置き換えます。リスト内包表記の実行で新しいリストを生成します。
# リスト内包表記
list_new = [i for i in range(5)]
# 等価なfor文
list_new = []
for i in range(5):
list_new.append(i)
print(list_new)
#結果
[0, 1, 2, 3, 4]
構文
[ 式 for 要素 in イテラブル]
イテラブル:iterable 要素を順に取り出すことのできるオブジェクト
式を使ってみます。取り出した要素を2倍にして新しいリストを作ります。
dub = [x * 2 for x in range(10)]
print(dub)
# 等価なfor文
dub = []
for x in range(10):
dub.append(x * 2)
print(dub)
# 結果
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
ifで条件分岐
リストの生成に後置のif句で条件をつけます。条件がtrueの場合のみ式として評価されます。次の例では3の倍数だけを取り出して新しいリストを作成します。
list_new = [ i for i in range(20) if i % 3 == 0]
# 等価なfor文
list_new = []
for i in range(20):
if i % 3 == 0:
list_new.append(i)
print(list_n)
# 結果
# [0, 3, 6, 9, 12, 15, 18]
三項演算子
条件を指定するif 条件式にif … else …を使うことができます。
[真の時の値式 if 条件 else 偽の時の値式 for 要素 in イテラブル]
labels = ['Even' if x % 2 == 0 else 'Odd' for x in range(10)]
print(labels)
# 結果
# ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']
#
# 等価のfor文
labels = []
for i in range(10):
if i % 2 == 1:
labels.append('odd')
else:
labels.append('even')
print(labels)
# 結果
# ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']
ネストしたループ
ループを2重にして変数を2つとることもできます。
list_new = [(row, col) for row in range(2) for col in range(3)]
print(list_new)
# 等価のforループ
list_new = []
for row in range(2):
for col in range(3):
list_new.append((row, col))
print(list_new)
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
ネストしたリストの内包表記
最後に公式のサンプルから少し面白い例を拾ってみます。4×3の行と列を入れ替えます。一見すると意味が分かりにくいのですが、等価のforループを見れば動きは理解できると思います。
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
# ネストしたリストの内包表記
transposed = [[row[col] for row in matrix] for col in range(4)]
# 等価のforループ
transposed = []
for col in range(4):
transposed_row = []
for row in matrix:
transposed_row.append(row[col])
transposed.append(transposed_row)
print(transposed)
# 結果
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
コメント