🐍 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のページで解説しています。