清单理解条件中的`elif`


128

我们可以elif在列表理解中使用吗?

范例:

l = [1, 2, 3, 4, 5]

for values in l:
    if values==1:
        print 'yes'
    elif values==2:
        print 'no'
    else:
        print 'idle'

我们可以elif采用与上面的代码类似的方式将列表理解包括在内吗?

例如,答案如下:

['yes', 'no', 'idle', 'idle', 'idle']

到现在为止,我仅使用ifelse理解列表。

Answers:


249

Python的条件表达式正是针对这种用例而设计的:

>>> l = [1, 2, 3, 4, 5]
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]
['yes', 'no', 'idle', 'idle', 'idle']

希望这可以帮助 :-)


5
语法中有一些有趣的历史。多年来,“三级表达”一直是该语言中要求最多的五种更改之一。自从Guido van Rossum明确将其设计为基于语句的语言以来,他就坚决抵制了很长时间(三级表达式,尤其是它们的滥用是代码中很多晦涩的来源)。当他最终屈服时,他宣布自己故意选择了一种防止过度使用的语法。像往常一样,他做了出色的设计工作。
holdenweb '18

1
三元,该死的(他写道,注意到阅读障碍的错误为时已晚,无法编辑)。
holdenweb '18

2
当我投票给这个答案时,我想提一下:1对if / else易于阅读,2对:变得越来越难以理解。甚至不提3对。如果表达式需要三对或更多对,字典或单独的函数将使事情更易于阅读和理解。
Hai Vu

1
我不想为这个问题添加解决方案,而是要提醒一些干净的代码:由于此列表理解具有三个条件,因此可以将其重构为更具描述性的方法。我的意思是:martinfowler.com/bliki/FunctionLength.html :)
Alvaro Cavalcanti

我偶然发现了一个需要省略号但只有两个值的情况。使用这个例子,我只['yes', 'no']需要被做。为此,您可以执行以下操作: ['yes' if v == 1 else 'no' for v in l if values in [1,2]]。我目前无法想到更干净的方法来执行此操作。
dTanMan

48
>>> d = {1: 'yes', 2: 'no'}
>>> [d.get(x, 'idle') for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

4
我认为这种形式比尝试在列表中执行冗长而复杂的if / else逻辑要容易得多
jdi 2012年

5
@jdi虽然条件表达式可能不适合您的口味,他们专门用来处理如果- elif的- elif的,别的链,就像OP请求。它们并不难学习,并且可以很好地处理字典查找逻辑不适合的情况: 'A' if grade>=90 else 'B' if grade>=80 else 'C' if grade>=70 else 'F'
Raymond Hettinger 2012年

1
如果d在理解之外进行定义是否有优势?
Chris_Rands

我更喜欢列表理解的原因是它读起来就像英语。甚至非程序员也能够理解它的作用。使用此解决方案,您必须了解dict.get()方法。
蒂姆·斯科夫·雅各布森

25

可以的。

请注意,当您使用以下语法时:

['yes' if v == 1 else 'no' for v in l]

您正在使用if / else运算符的三进制形式(如果您熟悉C之类的语言,则类似于?:Construct:)(v == 1 ? 'yes' : 'no')

if / else运算符的三进制形式没有内置的“ elif”,但是您可以在“ else”条件下对其进行仿真:

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]

这就像在说:

for v in l:
    if v == 1 :
        print 'yes'
    else:
        if v == 2:
            print 'no'
        else:
            print 'idle'

因此,没有像您问的那样直接的“ elif”构造,但是可以使用嵌套的if / else语句来模拟它。


最后一段代码非常有见地,谢谢!
devianceee,


2

您可以使用列表理解功能,以便从原始列表创建另一个列表。

>>> l = [1, 2, 3, 4, 5]
>>> result_map = {1: 'yes', 2: 'no'}
>>> [result_map[x] if x in result_map else 'idle' for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

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.