[英]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%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,4]
每个项目都针对x % 4 == 0
进行检查。 在后者中, filter
将lambda应用于q
每个项目,而不是 [2,4]
,而是[4,16]
。 因此, x % 4 == 0
返回true两次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.