过滤神秘输出

时间:2015-09-29 15:18:18

标签: python list filter lambda

我正在阅读filterlambdamap。当我尝试使用它们时,我发现了这个特点:

def returnAsIs(element):
    return element

print range(10)
print filter(returnAsIs, range(10))
print map(lambda x : x, range(10))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

为什么过滤器省略了第一个条目?

3 个答案:

答案 0 :(得分:7)

为什么在0中跳过了元素filter()

这是因为值0评估为False

根据.filter() docs:

  

根据函数的iterable元素构造一个列表   返回true。

因此,当我们将filter(function, iterable)应用于iterable时,只返回函数返回True的那些元素。

当Python迭代从09的元素时,它会检查哪个元素的计算结果为True,并且只返回那些元素。现在,0评估为False,因此filter()不会返回此值。仅返回19中的元素。

如何检查元素的布尔值?

由于您的函数按原样返回元素,我们需要检查哪些元素的计算结果为True。只返回那些评估为True的元素。

要检查布尔值,我们可以使用bool()函数。

In [1]: for x in range(10):
   ...:     print x, bool(x)
   ...:     
0 False # boolean-ness of '0' is False
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True

答案 1 :(得分:3)

这是因为python将0视为False。您可以使用函数bool

进行检查
>>> bool(0)
False

当您阅读docs时,

  

根据iterable的元素构造一个列表,该函数返回 true

因此,在过滤函数之后不会返回0,因为值的计算结果为False。类似的情况是0列表中的任何位置

>>> print filter(returnAsIs, [1,2,1,0])
[1, 2, 1]

答案 2 :(得分:0)

过滤器函数检查值是true还是false。 将真实值考虑在内,返回false的值将被拒绝,并在完成时返回一个列表... 以下是更好的代表性

  

filter(函数或无,序列) - >列表,元组或字符串

     

返回函数(item)为true的序列项。如果       function为None,返回true的项。如果序列是一个元组       或者字符串,返回相同的类型,否则返回一个列表。