190

以下のリンクを読みましたが、私の質問には対応していません。
Python には三項条件演算子がありますか? (質問は、if-elseステートメントを1行に要約することです)

if-elif-else ステートメントを 1 行に収まるように書く簡単な方法はありますか?
例えば、

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

または実際の例:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

上記の例を次のように書くことができれば、より簡潔に見えると思います。

x=2 if i>100 elif i<100 1 else 0 [WRONG]
4

14 に答える 14

261

いいえ、(少なくとも恣意的なステートメントでは) 不可能であり、望ましいことでもありません。すべてを 1 行に収めることは、行の長さが 80 文字を超えてはならないことが義務付けられているPEP-8に違反する可能性が最も高くなります。

また、Zen of Python にも反しています。「読みやすさが重要」です。(import thisすべてを読むには、Python プロンプトで入力します)。

Python では三項式を使用できますが、式に対してのみ使用でき、ステートメントに対しては使用できません。

>>> a = "Hello" if foo() else "Goodbye"

編集:

修正された質問は、割り当てられている値を除いて、3 つのステートメントが同一であることを示しています。その場合、連鎖三項演算子は機能しますが、それでも読みにくいと思います。

>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1
于 2012-12-25T09:16:46.143 に答える
87

ケースごとに異なる式のみが必要な場合は、これでうまくいく可能性があります。

expr1 if condition1 else expr2 if condition2 else expr

例えば:

a = "neg" if b<0 else "pos" if b>0 else "zero"
于 2012-12-25T09:36:08.597 に答える
27

別の if 句を else ステートメントにネストするだけです。しかし、それは見た目を美しくするものではありません。

>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'zero'
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'invalid value'
于 2012-12-25T09:42:41.757 に答える
8

オプションで、実際getに a のメソッドを使用できdictます。

x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)

getキーの 1 つが次のように評価されることが保証されている場合、このメソッドは必要ありませんTrue

x = {i<0: -1, i==0: 0, i>0: 1}[True]

理想的には、キーの最大 1 つが に評価される必要がありますTrue。複数のキーが と評価されるTrue場合、結果は予測できないように見える可能性があります。

于 2016-11-22T13:50:54.960 に答える
5

項演算子は、簡潔な式への最良の方法です。構文はvariable = value_1 if condition else value_2. したがって、あなたの例では、三項演算子を 2 回適用する必要があります。

i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0
于 2019-05-17T21:14:28.743 に答える
4
if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

上記のコードを 1 行で使用する場合は、次のコードを使用できます。

x = 2 if i > 100 else 1 if i < 100 else 0

そうすることで、x には、i > 100 の場合は 2、i < 100 の場合は 1、i = 100 の場合は 0 が割り当てられます。

于 2019-01-10T03:24:39.367 に答える
3

また、表現の性質にも依存します。「やらない」という他の回答に対する一般的なアドバイスは、一般的なステートメントと一般的な式に対して非常に有効です。

しかし、指定されたオプションの値に応じて異なる関数を呼び出すなど、「ディスパッチ」テーブルだけが必要な場合は、呼び出す関数を辞書内に配置できます。

何かのようなもの:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

if-else の代わりに:

if option=="save":
    save()
...
于 2012-12-25T12:55:19.550 に答える
2

人々はすでに三項式について言及しています。例として単純な条件付き割り当てを使用すると、数式を使用して条件付き割り当てを実行できる場合があります。これにより、コードが非常に読みやすくなるわけではありませんが、かなり短い 1 行にまとめられます。あなたの例は次のように書くことができます:

x = 2*(i>100) | 1*(i<100)

比較は True または False になり、数値で乗算すると 1 または 0 になります。| の代わりに + を使用できます。途中で。

于 2012-12-25T21:30:36.927 に答える