列表推导式中是否可以使用if/else/if?

3

我想知道是否可能使用带有if / else的列表推导式,而不需要生成与正在处理的列表长度相同的列表?(即不需要最后的else

>>> L = [0, 1, 2, 3, 4, 5, 6]
>>> [v * 10 if v < 3 else v * 2 if v > 3 else v for v in L] #if/else/if/else
[0, 10, 20, 3, 8, 10, 12]

功能正常。但是假设我想省略3,以获得:

[0, 10, 20, 8, 10, 12]  # No number 3

我本以为这会有效:
>>> [v * 10 if v < 3 else v * 2 if v > 3 for v in L] #if/else/if

但这是语法错误。

所以我想“也许”这会起作用:

>>> [v * 10 if v < 3 else v * 2 if v > 3 else pass for v in L] #if/else/if/else pass

但是它并没有...... 这是一个好奇的问题,我意识到这不一定是处理上述问题最可读/适当的方法。我错过了什么吗?它可以完成吗?(我使用的是Python 2.6.5)
4个回答

14

可以,这是可能的:

[foo for foo in bar if foo.something]

在你的情况下:

[v * 10 if v < 3 else v * 2 for v in L if v != 3]

它也在文档中提到过。


不是所有东西都必须使用列表推导式! - Jakob Bowyer
可以将其想象成普通的列表推导式 [expr_of_x for x in iterable if expr_of_x],但其中 (a if b else c) 是表达式。你甚至可以保留括号,以使列表推导式对读者更加明显。 - ninjagecko

4
在循环之后加上过滤条件:
 [v * 10 if v < 3 else v * 2 for v in L if v != 3]

返回结果
[0, 10, 20, 8, 10, 12]

0
    A=[[x*2, x*10][x <3] for x in L if x!=3]

2
你能解释一下为什么这个答案能解决问题吗?这个答案因为长度和内容的原因被标记为低质量。请参见[答案]。 - brasofilo

-2

做什么有问题?

out = []
for v in L:
    if v < 3:
        out.append(v * 10)
    elif v > 3:
        out.append(v * 2)
    else:
        pass

这并没有回答我关于列表推导式的明确问题! - fraxel
并不是所有的东西都必须使用列表推导式。 - Jakob Bowyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接