为什么不过滤(不是无,可迭代)?

时间:2016-06-24 23:06:44

标签: python python-3.x

由于filter()的定义是返回函数返回True的元素列表,因此对filter(not None, iterable)过滤到仅包含项的列表更有意义那不是NoneType

5 个答案:

答案 0 :(得分:5)

Quoting from the docs

  

如果function为None,则假定为identity函数,即删除所有可迭代的false元素。

换句话说,在第一个参数中传递None是一种特殊情况。删除所有false-y值。

但这并不意味着你所说的。通常filter期望可调用。 not None 是可调用的。它本身只是True您使用:

lambda x: x is not None

答案 1 :(得分:4)

  

由于filter()的定义是返回一个元素列表   其中功能返回True

not None不是函数,因此不可调用。 None用作身份谓词(而不仅仅是函数)的简写,在本例中可以是lambda x: bool(x)或简称为bool。所以,不管你提出什么建议,你都会这样做:

filter(lambda x: x is not None, iterable)

更多的是,None简写是适用于python中的一些其他内置函数的泛化:mapitertools.ifilteritertools.imapitertools.ifilterfalse其他

pythonic等价的filter(来自文档的迭代器版本)将会显示:

def filter(predicate, iterable):
    # filter(lambda x: x%2, range(10)) --> 1 3 5 7 9
    if predicate is None:
        predicate = bool # evaluates truth value of the object
    for x in iterable:
        if predicate(x):
            yield x 

答案 2 :(得分:3)

R只是not None。您正在考虑的正确语法是

True

这对你想要做的事情有用,但实际上并不是filter(lambda x: x is not None, iterable) 所做的。

filter(None, iterable)是一个特例。当filter(None, iterable)看到filter的过滤谓词时,会将其替换为标识谓词None。它过滤掉在布尔上下文中被认为是false的iterable中的任何对象。这意味着

lambda x: x

过滤掉filter(None, [None, 0, 1, 2]) None,而不只是0

答案 3 :(得分:3)

对于 python3 ,您不需要使用lambda,None.__ne__只会过滤

In [1]: list(filter(None.__ne__, [None, 0, 1, 2]))
Out[1]: [0, 1, 2]

答案 4 :(得分:1)

有点,你需要把它变成一个函数

filter(lambda x: x is not None, iterable)