他のないPython三項演算子


85

Pythonでこれを1行で行うことは可能ですか?

if <condition>:
    myList.append('myString')

私は三項演算子を試しました:

myList.append('myString' if <condition>)

しかし、私のIDE(MyEclipse)は、を付けずにそれを気に入らなかったelse


1
あなたは3つの部分を持たない三項演算子のような意味ですか?これは矛盾していませんか?
user2074 2120年

回答:


119

はい、あなたはこれを行うことができます:

<condition> and myList.append('myString')

<condition>falseの場合、短絡が発生し、右側は評価されません。<condition>trueの場合、右側が評価され、要素が追加されます。

上記を行うことは非常に非Python的であり、次のことに関係なく、これを書くのがおそらく最善であることを指摘しておきます。

if <condition>: myList.append('myString')

デモンストレーション:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']

10
この答えは技術的には正しいですが、プログラミングの習慣としては適切ではありません。Pythonは読みやすい言語を目指しているため、このコードはPython以外のコードと見なされます。
ランスEスローン氏

10
@LS:同意します。そのため、ifステートメントを使用するのがおそらく最善であると述べました。しかし、私はそれをより明確にするために答えを少し修正しました。
Claudiu 2013年

2
fyi 2番目の例はpep8チェックに失敗します:E701 multiple statements on one lineしたがって、非pythonic ...;)
Cas

1
@hard_working_ant「正しい」方法は以下のようになりx = object.get('attribute')、その場合には
wihlke

1
@wihlke:はい、さらになしをデフォルトにX = object.get(「属性」、なし)を追加
hard_working_ant

45

言語で構文の使用が許可されていない理由

variable = "something" if a_condition

それがなければ、が突然不明elseになった場合。デフォルトでに設定できるかもしれませんが、Pythonでは、すべての変数の割り当てが実際に明示的な割り当てになる必要があります。これは、関数呼び出しなどの場合にも当てはまります。関数に渡される値は、代入ステートメントのRHSと同じように評価されるためです。a_condition == FalsevariableNone

同様に、return条件付きreturnのsであっても、すべてのsは実際に戻る必要があります。例えば:

return variable if a_condition

許可されていませんが

return variable if a_condition else None

2番目の例は明示的に何かを返すことが保証されているため、許可されます。


1
Pythonがこれを使用できないのは皮肉なことであり、変数がまだvariable=None完全に合法であるということは決してありません。:D
ガイ

1
しかし、私はそれを次のように使用したかった: continue if i == 0forループで。
カランタン

2
許可されていますかelse pass?
OldBunny2800

5
else pass三元式はに渡すことができる値を返す必要があるため、は機能しませんreturnpassは有効なreturn値ではありません。
エメットバトラー

4
私は、この動機が本当の理由であり、if a_condition: variable = "something"それif a_condition: return variableが合法であることを考えると、同意しません。したがって、これは本質的にPythonの任意の構文上の選択です。
oulenz 2018年

13
if <condition>: myList.append('myString')

それ以外の場合はありません。なぜそれを一行にする必要があるのですか?

「三項演算子」であることを注意演算子。他の演算子と同様に、何かを返す必要があるので、else句なしで三項演算子を使用するにはどうすればよいですか?条件が真でない場合、何が返されるはずですか?


10

基本的にdo_thing() if <condition> else passコンストラクトを要求しています(実行するとスローされSyntaxErrorます)。私が(やや)同様の質問の 調査中に発見したdo_thing() if condition else Noneように、あなたが得ることができる限り近いです(これはちょうど別の方法です<condition> and do_thing())。したがって、このアイデアと他の回答を要約すると、次のオプションがあります。

  • if <condition>: myList.append('myString') —最も「ハッキー」な(したがって好ましい)方法のようです
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

最もハッキーな方法は機能しません。少なくともREPLではありません-構文エラーが発生します。同じ行の前のコードが原因のようです。代わりに、これを独自の行で実行する必要があります。ただし、その場合でも、省略記号をスキップするにはユーザー入力が必要です。
不明


0

あなたはこのようなことをすることができます:

myList.append('myString') if <condition> else False

または

myList.append('myString') if <condition> else 0

Falseと0はリストに追加されません。条件が満たされない場合、行は何かを返す必要があります。0またはFalseをNoneまたは空の文字列、あるいは必要なものに置き換えることができ、リストには影響しません。
ZacharyChiodini20年

当時の私の考えはリスト内包の場合だったと思います。私のコメントを削除しました、反対票は私ではありませんでした。よりクリーンな方法はそうすることmyList.append('myString') if True else _だと思いますが、何も割り当てていないのであれば、問題ではありません。私はこの人が同様の論理でリスト内包を試みているのではないかと心配しています。
デイブ劉

0

条件に基づいてオプションの要素をリストに追加したい場合は、これを実行します。

nums = [
        1,
        2,
        3 if <condition> else None,
        4,
       ]
nums = [i for i in nums if i is not None]

これは、条件が満たされない場合に値をNoneに置き換えるだけで、後で、None値なしでリストを再定義するだけです。このようにして、条件が満たされた場合にインデックスを保持します

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