Pythonのリスト内包表記でif,elseの書き分けと使いかた

リスト内包表記は簡潔にリストを作成できます。その際に、ifやelseを用いて、ロジックを入れたい場合があります。

これは大別すると以下の二つのケースに分けることができます。

  • ifのみの場合
  • elseも用いる場合

少々難しいことに、この二つは記載の方法が異なります

ifのみを使用したい場合

この場合、forの後ろにifを追加します。

dat = [i for i in range(10) if i%2 == 0]

print(dat)
# [0,2,4,5,6,8]

リスト内包表記 + if の使い道として、forの対象にした、別のリストに対し、ifでフィルターをかけたり、一部の値の置き換えや、加工処理をかけるのが、一般的です。
この時、リスト内包表記はワンライナーでシンプルにかけることがメリットになります。

なお、上記は以下のforで書き直した形と同じになります。

dat = []
for i in range(10):
    if i%2 == 0:
        dat.append(i)

メリットだけでなくデメリットものベルト、forと比べると横に長くなり、コードの一覧性が下がる、などといったものがあります。

elseも使用したい場合

この場合、elseが足されるだけでなくifの位置も変化します。

dat = [i if i%2 == 0 else "spam" for i in range(10)]
print(dat)
# [0,"spam",2,"spam",4,"spam",6,"spam",8,"spam"]

これは三項演算子と似ています。

result = True if 1==1 else False
print(result)
# True

使い方としては、より複雑な分岐をかけたいとき、になると思われます。

elifはあるか?

なお、elifは用いることができません。 まとめると、以下の表になります。

リスト内包表記を使う場合

ifのみ elseも使う elif
ifは最後 三項演算子を最初 使用できない

ただし、elseを使うと既に結構複雑であること、elifは使えないことを考えると、ifまでの使用にし、それ以上は関数化して呼び出す方が良いかと思います。