Python リスト内包表記

python Python

リスト内包表記はリストを生成するシンプルな手段を提供します。

基本的な構文

最も基本的な使い方は、通常の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]]

コメント

タイトルとURLをコピーしました