**list comprehension(リスト内包表記)**は、iterable を変換したりフィルタしたりして list を 1 つの式で構築する、簡潔で読みやすい方法です。list に append する for ループに代わる、Python のイディオム的な手法です。
基本構文
python
squares = []
n ():
squares.append(n ** )
squares = [n ** n ()]
これは「range(5) の各 n について、n の二乗」と読みます。手動のループより簡潔で、多くの場合より高速です。
# keep only even numbers
evens = [n for n in range(10) if n % 2 == 0] # [0, 2, 4, 6, 8]
# transform AND filter together
result = [n * 2 for n in range(10) if n % 2 == 0] # [0, 4, 8, 12, 16]
# if/else goes BEFORE the for (it's part of the expression, not a filter)
labels = ["even" if n % 2 == 0 else "odd" for n in range(4)]
# ["even", "odd", "even", "odd"]
{x ** 2 for x in range(5)} # set comprehension → {0, 1, 4, 9, 16}
{k: v for k, v in pairs} # dict comprehension
(x ** 2 for x in range(5)) # generator expression — LAZY, memory-efficient
同じ構文で set や dict も構築できます。丸括弧を使うと、値を遅延的に生成する generator expression になります(list 全体をメモリに保持しないため、大規模データに最適です)。
# ❌ deeply nested / complex logic → a regular loop is more readable
matrix = [[row[i] for row in data] for i in range(cols)] # OK, but don't over-nest
comprehension はシンプルに保ちましょう。複数のネストされたループや複雑な条件分岐が必要なら、通常のループの方が分かりやすくなります。
list comprehension はまさに「Pythonic」であり、簡潔で読みやすく、同等のループより高速なことも多いため、データの変換やフィルタに常時使われます。
これら(および set/dict/generator のバリアント、大規模データ向けの遅延的な generator expression)を使いこなすことは、イディオム的な Python を書く上で不可欠です。
いつ使うべきか(単純な変換/フィルタ)と、いつ通常のループを使うべきか(複雑なロジック)を知っていることは、きれいで読みやすいコードの証です。