想想这个例子:

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

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

而不是打印结果,我想使用一个列表理解来创建一个结果列表,如['yes', 'no', 'idle', 'idle', 'idle']。

如何在列表理解中表示elif逻辑?到目前为止,我只在列表推导式中使用if和else,就像在列表推导式中使用if/else一样。


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']

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

你可以使用列表推导式来从原始列表中创建另一个列表。

>>> 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']

你可以,在某种程度上。

注意,当你像这样使用sytax时:

['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语句来模拟。


另一种简单的方法是像这样使用条件列表推导式:

l=[1,2,3,4,5]
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l]

给你正确的答案:

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

也许你想要这样:

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

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l])