Python三元运算符


82

是否可以在Python中一行执行此操作?

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

我已经尝试过三元运算符:

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

但是我的IDE(MyEclipse)不喜欢它,没有一个else


您的意思是像没有三部分的三元运算符?这不是矛盾吗?
洛恩侯爵

Answers:


115

是的,您可以这样做:

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

如果<condition>为假,则短路将开始,并且右侧将不被评估。如果<condition>为true,则将评估右侧并添加元素。

我只是指出,执行上述操作是完全非Python的,无论如何,最好编写此代码:

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

示范:

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

9
尽管此答案在技术上是正确的,但这不是一个好的编程习惯。由于Python旨在成为一种易于阅读的语言,因此该代码将被视为非Python语言。
Lance E Sloan先生

9
@LS:我同意,这就是为什么我说最好使用if语句的原因。但是我对答案做了一些修改,以使其更清楚。
克劳迪(Claudou)

2
仅供参考,第二个示例将无法通过pep8检查:E701 multiple statements on one line同样,非pythonic ...;)
Cas

1
@hard_working_antx = object.get('attribute')在这种情况下将是“正确的”方法
wihlke

1
@wihlke:是,并进一步添加x = object.get('attribute',None)默认为None
hard_working_ant

43

语言不允许您使用语法的原因

variable = "something" if a_condition

else是,在的情况下a_condition == Falsevariable突然不明。也许它可以默认为None,但是Python要求所有变量分配实际上都导致显式分配。这也适用于诸如函数调用之类的情况,因为传递给函数的值的评估与赋值语句的RHS一样

同样,所有returns都必须实际上返回,即使它们是条件returns也是如此。例如:

return variable if a_condition

不允许,但是

return variable if a_condition else None

之所以允许,是因为第二个示例保证可以显式返回某些内容。


1
具有讽刺意味的是,Python如何不允许我们使用它,从而使变量永远还没有variable=None完全合法。:D
盖伊2014年

1
但是我想这样使用它: continue if i == 0在for循环中。
karantan

2
你被允许做else pass?
OldBunny2800

5
else pass不起作用,因为三元表达式应返回可以传递给的值returnpass不是有效值return
艾米特·巴特勒

4
我不同意,这个动机是真正的原因,因为if a_condition: variable = "something"if a_condition: return variable是合法的。因此,它本质上是python的任意语法选择。
oulenz

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') -似乎是最少的“ hacky”(因此是首选)方式
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

最少的骇客方式是行不通的。至少在REPL上没有-一个语法错误。似乎是由同一行中的先前代码引起的。这需要在其自己的行上执行。但是即使这样,也需要用户输入才能跳过省略号。
Unknow0059

3

myList.extend(['myString'] if condition else []) 也可以,尽管比其他解决方案要复杂得多。


0

您可以执行以下操作:

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

要么

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

False和0没有添加到列表中。如果不满足条件,该行仅需要返回一些内容。您可以将0或False替换为None或一个空字符串或任何您想要的值,并且不会影响列表。
Zachary Chiodini

我认为当时我的想法是在理解列表的情况下。删除了我的评论,downvote不是我。我想这样做会比较干净,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值的列表。这样,如果满足条件,他们将保留索引

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.