内包表記を覚えたての頃は、あらゆる 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 文。