リスト内包表記は簡潔にリストを作成できます。その際に、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までの使用にし、それ以上は関数化して呼び出す方が良いかと思います。