1行のif条件割り当て


140

次のコードがあります

num1 = 10
someBoolValue = True

私はの値に設定する必要があるnum1とし20た場合someBoolValueですTrue。それ以外は何もしません。だから、これはそのための私のコードです

num1 = 20 if someBoolValue else num1

どういうわけか私は...else num1それをよりきれいに見せるためにその部分を避けることができますか?と同等

if someBoolValue:
    num1 = 20

私はそれを次の...else passように置き換えてみました:num1=20 if someBoolValue else pass。私が得たすべては構文エラーでした。また、私はその...else num1部分を省略できませんでした。


2
すべてをに変更してくださいnum1 = 20 if someBoolValue else 10。次に、num1=10ラインも保存しますか?
Thomas Ahle、2011年

ありがとう。しかし、これは正確には私のコードではありません。私はそれnum1がすでに存在することを意味しました...
bdhar

回答:


195

あなたが実際にしようとしていることがおそらく次のようなものに拡張されるので、これはPythonでは可能ではないと思います:

num1 = 20 if someBoolValue else num1

除外する場合 else num1と、割り当てが実際に何かを返す必要があると確信しているため、構文エラーが発生します。

他の人がすでに述べたように、これを行うことができますが、次回そのコードを読むときにおそらく混乱するだけなので、悪いことです。

if someBoolValue: num1=20

num1 = someBoolValue and 20 or num1同じ理由で私はの大ファンではありません。私は実際にその行が何をしているのかを二度考えなければなりません。

あなたがやりたいことを実際に達成する最良の方法は、元のバージョンです:

if someBoolValue:
    num1 = 20

これが最良のバージョンである理由は、何をしたいのかが非常に明白であり、自分自身を混乱させたり、後で他の人がそのコードに接触する可能性があるためです。

また、num1 = 20 if someBoolValueRubyの動作が少し異なるため、補足として、は有効なRubyコードです。


8
PEP-308(docs.python.org/2.5/whatsnew/pep-308.htmlに従い、のように括弧で囲むと条件式をより明確にすることができますnum1 = (20 if someBoolValue else num1)
haridsv 2017

46

これを使って:

num1 = 20 if someBoolValue else num1

3
これは私が..を使用していて、代替を探しているものです。とにかくありがとう!!
bdhar

このブロックを呼び出す方法は?名前ってなんですか?
19

1
三項演算子
Chris Maes

大規模なデータセットをループする場合、else-statementが発生する場合に備えて不要な割り当てが発生するため、このアプローチを使用しないでください。
dapc

21

1行で:

if someBoolValue: num1 = 20

しかし、それをしないでください。このスタイルは通常予期されていません。人々は明確さと一貫性のために長い形式を好みます。

if someBoolValue:
    num1 = 20

(同様に、キャメルキャップは避けてください。代わりにを使用してくださいsome_bool_value。)

述部が偽の場合は戻り値がないため、パーツのないインライン は存在しないsome_value if predicateことに注意してくださいelse。ただし、すべての場合において、式には明確に定義された戻り値が必要です。これは、RubyやPerlなどの使用法とは異なります。


2
読みづらくなり、自分のコードで混乱してしまうかもしれませんし、それは決して良い考えではありません。
フロスト

@bdhar、なぜあなたはそれを一行に入れたいのですか?それはこれ以上速くは実行されず、他の人が読むのが難しくなるでしょう
John La Rooy

1
@gnibbler、実際には理由はありません。私は...読みやすくするとの短いフォームを探していた
bdhar

17

次のいずれかを使用できます。

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
素敵なワンライナー条件付き割り当て
minhas23

その「構造」はどのように呼ばれますか?Pythonを学習してから約6か月間、これは見たことがありません。
ギモート

1
少なくともこれらは割り当てではありませんが、それらを前に配置しない限り、次に、ここで説明する方法では機能しません。最初のものはタプルを作成し、次にその要素の1つをインデックスで選択します。はのサブクラスなので、-1から1までの整数、またはTrue/ を返すテストでのみ機能します。テストがtrueと評価するだけのものを返す場合はすべて、例外で失敗します。2番目の方法は、それ自体がfalseと評価されない限り機能します。これにより、テストがtrueの場合でもbeeingが割り当てられます。FalseboolinttrueValfalseVal
Bachsau

短いですが、「推奨パターン」として安全に使用するには非常に注意が必要です。上記のバクサウのコメントを参照してください...(だから私は反対投票しました)
tverrbjelke

6

いいえ。私はあなたが何かがうまくいくことを望んでいたと思いますがnum1 = 20 if someBoolValue、それはうまくいきません。私はifあなたがそれを書いたように文を使うことが最善の方法だと思います:

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

それが私の新しい最終的な答えです。以前の答えは次のとおりであり、述べられた問題に対して過剰でした。Getting_too_clever == not Good。これが以前の答えです... Truecondとの別のものを追加したい場合はまだ良いですFalse

num1 = 10 + (0,10)[someBoolValue is True]

あなたnum1はすでに放置されるべき値をすでに持っているとあなたは述べました。それがnum1 = 10投稿の最初のステートメントであるため、私は仮定しました。そのため、取得する操作20はadd 10です。

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

この出力を生成しました

num1 = 20
someBoolValue = True

今、私は 'num1 = 10 + 10 *(someBoolValue == True)'と答えるべきだったと思っています。「False」に別の値を追加するという選択が必要な場合は、以前の答えの方が適しています。投稿を編集しますか、それともコメントで行いますか?
MikeyB 2017


2

ブール値がtrueの場合にメソッドを呼び出したい場合は、3項else Noneを終了するように指定できます。

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

1行のコードが間違いなく発生する場合、Python 3.8は、「セイウチ演算子」として親しまれている割り当て式を導入しています。

:=

someBoolValue and (num := 20)

20割り当てられますnum最初のブール式がある場合True。割り当てはここで括弧内にある必要があります。そうしないと、構文エラーが発生します。

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

グーグルからの将来の時間旅行者のために、ここに新しい方法があります(Python 3.8以降で利用可能):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

-1

必要な場合は、間違いなくnum1 =(someBoolValueの場合は20、num1の場合は20)を使用できます。


上記の回答の重複ですか?
Adam Smith、

-1

これが私が提案できることです。別の変数を使用してif節を導出し、それをnum1に割り当てます。

コード:

num2 =20 if someBoolValue else num1
num1=num2


-1

この方法でそれを行うことができます。

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

この方法で問題を解決できますが、 'try / except block'を使用することはPythonのベストプラクティスではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.