如果没有其他 - Python列表

时间:2014-09-10 20:36:02

标签: python list

我知道以下代码有效:

list = [1 , 2 if 1==1 else 0, 3]

但如果if表达式(在这种情况下为1 == 1)返回false,我怎么能省略列表插入?

我的意思是,如果表达式无效,我不想插入任何值(包括'None','[]')。

我试过这样的事情

list = [1 , 2 if 1==1, 3]

但它不起作用。

2 个答案:

答案 0 :(得分:8)

您无法使用该用法,因为您正在定义具有三个值的文字列表。通过在括号中放置两个逗号和三个表达式,您已承诺在列表中提供三个元素。没有评估某种东西,就没有办法让表达“消失”。

在实际列表 comprehension 中,您可以将if放在for子句而不是目标表达式中来完成:

>>> x = [1, 2, 3, 4]
>>> [a if a != 3 else 'three' for a in x]
[1, 2, 'three', 4]
>>> [a for a in x if a != 3]
[1, 2, 4]

第一个理解使用条件表达式a if a != 3 else 'three',它必须同时具有ifelse部分,因为表达式必须求值为某个值。第二种理解使用if a !=3,因为这是列表理解语法的一部分;它不是条件表达式的一部分,在这种情况下不能包含else。它的工作是简单地限制将x中的值分配给a,而不是评估值本身。

答案 1 :(得分:5)

要选择在列表中包含项目,您必须将分配分为几个部分:

l = [1] + ([2] if 1 else []) + [3]

(括号可能是可选的,但它们不会受到伤害;我不确定条件表达式的优先级。)

这是写作的简短方法

if 1:
    l = [1] + [2] + [3]  # Which is just [1,2,3]
else:
    l = [1] + [] + [3]   # Which is just [1,3]

列表文字中指定的任何元素都必须存在;没有办法在Python中编写可能不存在的项。


如果您熟悉Perl,类似的 可能是,但仅仅因为Perl具有非常不同的语义。

比较作业

@list = (1, 0 ? 2 : (), 3)

将生成列表(1, 3),因为(1, (), 3)被解释为3个列表(1,), (), and (3,)的串联,部分原因是您无法将列表嵌套在其他列表中。另一方面

@list = (1, 1 ? 2 : (), 3)

生成列表(1, 2, 3)