由于filter()
的定义是返回函数返回True
的元素列表,因此对filter(not None, iterable)
过滤到仅包含项的列表更有意义那不是NoneType
?
答案 0 :(得分:5)
如果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中的一些其他内置函数的泛化:map
,itertools.ifilter
,itertools.imap
,itertools.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)