繁体   English   中英

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

[英]Difference between filter and 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]
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] ,并且两个元素都超过了过滤器选择器

因为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( 2%42 ):

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,4]每个项目都针对x % 4 == 0进行检查。 在后者中, filter将lambda应用于q每个项目,而不是 [2,4] ,而是[4,16] 因此, x % 4 == 0返回true两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM