列表理解与多条件

问题描述 投票:-1回答:0

以下代码在Python中工作

var=range(20)
var_even = [0 if x%2==0 else x for x in var]
print var,var_even

但是,我以为条件需要放在列表的最后。如果我把代码写成

var_even = [0 if x%2==0 for x in var]

那就不能用了。这其中有什么原因吗?

python list-comprehension
4
投票

这里涉及到两种截然不同但相似的语法。条件表达式列表理解过滤句.

一个条件表达式的形式是 x if y else z. 这种语法与列表理解无关。如果你想在列表理解中有条件地包含一件事情或不同的事情,你就应该使用这种语法。

var_even = [x if x%2==0 else 'odd' for x in var]
#             ^ "if" over here for "this or that"

列表理解的过滤子句是 if thingelem for x in y if thing. 这是列表理解语法的一部分,它位于 for 子句。如果你想在一个列表理解中有条件地包含或不包含一个元素,这就是你要使用的。

var_even = [x for x in var if x%2==0]
#                          ^ "if" over here for "this or nothing"

1
投票

0 if x%2==0 语法是 value1 if conditionX else value2 它的作用是如果条件X为真,它返回value1,否则返回value2。如果你想从列表中获取事件编号,你不能使用它,如果是偶数,你总是返回值0,而且你错过了 else子句。

你可以这样实现。

>>> var_even = [x for x in var if x % 2 ==0]
>>> var_even
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

或者,你可以使用过滤器。

>>> even_numbers = filter(lambda x: x % 2 == 0, var)
>>> list(even_numbers)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
© www.soinside.com 2019 - 2024. All rights reserved.