过滤器和列表理解之间的区别

时间:2015-11-25 08:56:45

标签: python list filter list-comprehension

我使用的是Python 3,我的问题是为什么输出不同?

print([x * x for x in range(2, 5, 2) if x % 4 == 0]) # returns [16]

q = [x * x for x in range(2, 5, 2)]
print(list(filter(lambda x: x % 4 == 0, q))) # returns [4, 16]

3 个答案:

答案 0 :(得分:4)

print(([x * x for x in range(2, 5, 2) if x % 4 == 0]))

此处,range评估为[2,4],只有[4]才能超过if条件

q = ([x * x for x in range(2, 5, 2)])
print(list(filter(lambda x: x % 4 == 0, q)))

此处,q包含每个元素的x*x,因此列表为[2*2, 4*4] = [4, 16],两个元素都超过了过滤器选择器

答案 1 :(得分:2)

因为q包含正方形

In [2]: q
Out[2]: [4, 16]

并且lambda x: x % 4 == 0将为这两者返回True

In [3]: 4 % 4 == 0
Out[3]: True

In [4]: 16 % 4 == 0
Out[4]: True

列表理解在 执行检查后将数字 与<2> 4 2 >):

In [5]: 2 % 4 == 0
Out[5]: False

因此, 2 * 2 = 4 将不会包含在列表中。

简而言之,如果您想获得相同的行为,请在计算余数之前将列表理解修改为平方数:

[x * x for x in range(2, 5, 2) if pow(x, 2, 4) == 0] # [4, 16]
#                                   ↖ equivalent to (x ** 2) % 4

答案 2 :(得分:1)

在前者中,[2,4]中的每个项目都会针对x % 4 == 0进行检查。在后者中,filter将lambda应用于q中的每个项目,其中不是 [2,4],而是[4,16]。因此,x % 4 == 0返回true两次。