我知道以下代码有效:
list = [1 , 2 if 1==1 else 0, 3]
但如果if表达式(在这种情况下为1 == 1)返回false,我怎么能省略列表插入?
我的意思是,如果表达式无效,我不想插入任何值(包括'None','[]')。
我试过这样的事情
list = [1 , 2 if 1==1, 3]
但它不起作用。
答案 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'
,它必须同时具有if
和else
部分,因为表达式必须求值为某个值。第二种理解使用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)
。