Python filter 不按预期工作?

2 投票
2 回答
4073 浏览
提问于 2025-04-17 16:04

为什么下面这两个过滤表达式返回的结果是一样的呢?

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

撰写回答