Python filter 不按预期工作?
为什么下面这两个过滤表达式返回的结果是一样的呢?
A = [(1,(1,2,3))]
A1 = filter(lambda (a,b): b, A)
A2 = filter(lambda ab: ab, A)
A1 == A2
>>>> True
2 个回答
2
这不是一个错误。filter
函数会筛选出你给的函数返回 True
的值。
在第一个例子中,你把一个元组拆开成 1
和 (1,2,3)
,然后你查看第二个部分((1,2,3)
)——这个部分是非空的,所以 filter
就把整个东西都返回了。
在第二个例子中,你查看的元组是 (1,(1,2,3))
。这个也是非空的,所以它又把整个东西返回了。
3
filter
是一个用来筛选参数的工具,当你把参数传给它时,如果返回的是一个看起来像 False
的值,它就会把这个参数过滤掉。比如说,(1, 2, 3)
和 (1, (1, 2, 3))
在布尔上下文中都被认为是 True
,所以它们会保留在返回的列表里。
如果你想要做其他的操作,应该使用 map
。
A1 = map(lambda (a,b): b, A)
A2 = map(lambda ab: ab, A)
顺便说一下,以下这些值被认为是 False
的,而其他的值都是 True
的:
0
None
False
''
[]
()
# and all other empty containers