内包表記を覚えたての頃は、あらゆる for 文を1行にしたくなります。しかし内包表記の価値は短さではなく、「このリストは何か」を1文で宣言できることにあります。
向いているケース
python
# 「価格リストの、税込価格のリスト」と読める prices_with_tax = [int(p * 1.1) for p in prices] # 「在庫があるものだけの名前のリスト」 in_stock = [item.name for item in items if item.stock > 0]
どちらも日本語1文で説明できます。この状態なら内包表記が最適です。
向いていないケース
python
# 読み解くのに時間がかかる
result = [transform(x) if check(x) else fallback(x)
for row in matrix for x in row if x is not None]
ネストが2段になったり、条件分岐が式の中に入り込んだら、普通の for 文に戻してください。行数は増えますが、3か月後の自分が読める確率は跳ね上がります。
辞書と集合にも同じ書き方がある
python
by_id = {user.id: user for user in users}
unique_tags = {tag for post in posts for tag in post.tags}
判断基準
声に出して1文で説明できるなら内包表記、「まずこれをして、次に」と言いたくなったら for 文。