Pythonの三項演算子

Pythonでは他言語のように特有の三項演算子はありません。ですが三項演算子のように記述するこは可能なのでその方法を説明します。

基本的な書き方

Pythonには三項演算子はありませんが、if文の条件式を1行で記述し三項演算子と同じように書くことができます。

値1 if 条件 else 値2

条件が満たされる場合は値1を使用し、そうでなければ値2を使います。

例えば次のコードを見てみましょう。

n = 55
result = 'odd' if n%2 == 1 else 'even'

これは変数nの値が奇数のときは文字列’odd’、そうでなければ(偶数のとき)文字列’even’を変数resultに代入します。

この場合変数nには55が格納されているので、変数resultには文字列’odd’が代入されます。

値になる部分にはリテラル値や関数は記述できるがプログラム文は記述できません。

条件式をネストした書き方

この条件式は多重にネストすることもできます。

値1 if 条件1 else 値2 if 条件2 else 値3

条件1が満たされる場合は値1を使用し、そうでなければ次(右)に書かれている条件式を見ます。

条件1が満たされない場合は条件2をチェックし、条件2が満たされる場合は値2を使います。

そうでない場合(条件1も条件2も満たされない場合)は、値3を使います。

例えば次のコードを見てみましょう。

n = 1
result = 'positive' if n>0 else 'negative' if n<0 else 'zero'

これは変数nの値が0より大きければ文字列’positive’、そうでなく、もし変数nが0より小さければ文字列’negative’、そのどちらでもないときは、文字列’zero’を変数resultに代入します。

内包表記で条件式を使う

この条件式は内包表記でも使えます。

例えば次のコードを見てみましょう。

sample_list = [n for n in range(10) if n%2 == 0]
print(sample_list) # [0, 2, 4, 6, 8]

これはfor文の繰り返しでrange関数で取得した数値が偶数の値を使う内包表記となります。

なので変数sample_listには[0, 2, 4, 6, 8]のリストが代入されます。

先程のようにelseをともなった条件式を使った例が次です。

sample_list = ['even' if n%2 == 0 else 'odd' for n in range(10)]
print(sample_list) # ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']

この場合、条件式はfor文の左に記述します。

また、条件式のネストも同じように記述できます。

ラムダ式で条件式を使う

この条件式はラムダ式でも使えます。

例えば次のコードを見てみましょう。

sample_list = [n for n in range(10)]
print(sample_list)
sample_list.sort(key=lambda n: 'odd' if n%2 else 'even')
print(sample_list)

0~9の整数を10個要素に持つリストをsortメソッドを使って並び変えます。

そのときsortメソッドのkey引数を使ってソート時に実行する関数を指定します。

そこでlambda式を使って先程のような条件式を実行することもできます。

この例は、リストの要素の数値が奇数のときは文字列odd、偶数のときは文字列evenに置き換えてソートします。

なので、ソード後の変数sample_listは[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]となります。

偶数の数値をソートしてから奇数の数値をソートしていますね。

この他にもmap関数でlambda式で条件式を利用したりするなど、いろいろと便利に利用できると思います。