我知道以下代码是有效的:
list = [1 , 2 if 1==1 else 0, 3]
Run Code Online (Sandbox Code Playgroud)
但如果if表达式(在这种情况下为1 == 1)返回false,我怎么能省略列表插入?
我的意思是,如果表达式无效,我不想插入任何值(包括'None','[]').
我试过这样的事
list = [1 , 2 if 1==1, 3]
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
您无法使用该用法,因为您正在定义具有三个值的文字列表.通过在括号中放置两个逗号和三个表达式,您已承诺在列表中提供三个元素.如果没有评估某些东西,就没有办法让表达"消失".
在实际的列表理解中,您可以通过将ifin 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]
Run Code Online (Sandbox Code Playgroud)
第一个理解使用条件表达式a if a != 3 else 'three',它必须具有两个部分if和else部分,因为表达式必须求值为某个值.第二种理解使用,if a !=3因为这是列表理解语法的一部分; 它不是条件表达式的一部分,在这种情况下不能包含else.它的工作是简单地限制x分配哪些值a,而不是评估值本身.
要选择在列表中包含项目,您必须将分配分为几个部分:
l = [1] + ([2] if 1 else []) + [3]
Run Code Online (Sandbox Code Playgroud)
(括号可能是可选的,但它们不会受到伤害;我不确定条件表达式具有什么优先级.)
这是一种简短的写作方式
if 1:
l = [1] + [2] + [3] # Which is just [1,2,3]
else:
l = [1] + [] + [3] # Which is just [1,3]
Run Code Online (Sandbox Code Playgroud)
列表文字中指定的任何元素都必须存在; 没有办法在Python中编写可能不存在的项.
如果您熟悉Perl,那么类似的东西是可能的,但这只是因为Perl具有非常不同的语义.
比较作业
@list = (1, 0 ? 2 : (), 3)
Run Code Online (Sandbox Code Playgroud)
这将生成列表,(1, 3)因为它(1, (), 3)被解释为3个列表的串联(1,), (), and (3,),部分原因是您无法将列表嵌套在其他列表中.另一方面
@list = (1, 1 ? 2 : (), 3)
Run Code Online (Sandbox Code Playgroud)
生成列表(1, 2, 3).
| 归档时间: |
|
| 查看次数: |
3473 次 |
| 最近记录: |