🐍 Python

リスト内包表記 [式 for 変数 in イテラブル if 条件]

forループを1行で書き、新しいリストを組み立てる構文です。AIが生成するPythonコードで非常に高い頻度で登場するため、forループとの対応関係さえ理解できれば怖くありません。

構文: [式 for 変数 in イテラブル]
      [式 for 変数 in イテラブル if 条件]

基本の使い方

各要素を2乗したリストを作る例です。

squares = [x * x for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

if条件で絞り込む

末尾にif 条件を付けると、条件に合う要素だけを対象にできます。

evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

ネストしたリストを平坦化する

forを2つ並べると、二重ループと同じ意味になります。二次元リストを1次元に平坦化する定番パターンです。

matrix = [[1, 2], [3, 4]]
flat = [x for row in matrix for x in row]
print(flat)  # [1, 2, 3, 4]

forループとの対応関係

リスト内包表記は、次のforループと完全に同じ結果になります。まずforループで書いてから内包表記に書き換える、という順番で慣れるのがおすすめです。

# forループ版
result = []
for x in range(5):
    if x % 2 == 0:
        result.append(x * 2)
print(result)  # [0, 4, 8]

# リスト内包表記版(同じ結果)
comp_result = [x * 2 for x in range(5) if x % 2 == 0]
print(comp_result)  # [0, 4, 8]
forループとの対応
[式 for x in ...]
forループ内のresult.append(式)に相当
[... for x in イテラブル]
forループのfor x in イテラブル:にそのまま対応
[... if 条件]
forループ内のif 条件:に相当。条件を満たさない要素はリストに含まれない
💡 複雑になりすぎたらforループに戻す判断も大切

内包表記は簡潔ですが、条件分岐やネストが増えると1行に詰め込みすぎて逆に読みにくくなります。AIが生成したコードで内包表記が3段以上ネストしていたり、1行がエディタの横幅を超えていたりする場合は、通常のforループに書き直した方が保守しやすいことが多いです。「短く書けるか」より「読んですぐ意味が分かるか」を優先しましょう。

各要素を関数で変換・絞り込みたい場合の別の書き方はmap/filterのページで解説しています。

← Python list クイックリファレンス一覧へ戻る