在Python3中使用过滤器

在Python3中使用过滤器,python,Python,我几乎是在复制在线文档中给出的示例,但是在基于windows的Python 3中使用filter()让我感到困惑。这里出了什么问题: a=[1,2,3,4] b=[1,0,1,0] f=filter(b,a) for fs in f : print(fs) ... 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“列表”对象不可调用 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“列表”对象不可调用 在线文档说要抛

我几乎是在复制在线文档中给出的示例,但是在基于windows的Python 3中使用filter()让我感到困惑。这里出了什么问题:

a=[1,2,3,4]    
b=[1,0,1,0]    
f=filter(b,a)    
for fs in f : print(fs)

...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“列表”对象不可调用

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“列表”对象不可调用


在线文档说要抛出
list()
,但这显然没有帮助。

过滤器的第一个参数必须是函数或lambda。您通过了
b
,这是一个列表。

您误解了
过滤器的工作原理,
过滤器
需要一个函数,该函数为您要保留的每个项目返回
True

我假设
b
描述了
a
中您想要选择的内容,那么您的意思是:

f = filter(lambda x: x[1], zip(a, b))
for fs, _ in f: ...
您还可以用列表替换
过滤器

f = [x for x, y in zip(a, b) if y]
for fs in f: ...
但是,
itertools
中有一个函数正是这样做的:

import itertools as it
f = it.compress(a, b)
for fs in f: ...

基本上filter接受一个函数和一个iterable值进行过滤

a = [1,2,3,4]
b = [1,0,1,0]
f = filter(lambda val: val not in b, a)
for fs in f: print(fs)
输出:

2
3
4
当我们用None调用filter时会出现混乱

list(filter(None, [0,1,2]))
# This returns [1,2] Which is a special case
# and it is not equal to:
list(filter(1, [0,1,2])) #invalid
原因是当我们将筛选条件传递为
None
filter函数检查列表中的每个值,并查看它们是否符合
if值
条件

大致可以这样翻译

[value for value in [0,1,2] if value]

Filter的文档清楚地表明它接受一个函数和一个iterable作为输入。如果要检查a和b中是否都有值,可以执行以下操作:

f = filter(lambda x: x in b, a)

然后在f上循环。

您希望在这里得到什么输出?请注意,
filter
与“在两个列表中查找这些列表中的元素”是不同的,您指的是什么在线文档?不要说“加入列表()”。你指的是哪些在线文档?
b
是否表示您想要和不想要
a
中的哪些值,即
b
a
上的掩码?
lambda
不是函数(匿名)?@AChampion是的。我单独提到它只是为了强调它。这正是我需要理解的。我一直很好奇,为什么Python不提供“显而易见”的解决方案作为基本情况,而对于更丰富的情况则提供更复杂的解决方案……在这种情况下,在我看来(我看到了许多错误的例子),过滤器([1,0,1,0],[2,4,6,8])应该返回一个列表(或者在Python中是一个生成器),该列表会返回(适合于该版本)答案是2和6,即一个掩码。如果是我调用,“filter”将只使用一个掩码,而名为ffilter或类似的东西将需要lambda…lambda似乎既有不必要的击键,也有不必要的函数调用,还有错误/神秘的代码。@eSurfsnake不确定过滤器API的设计原因。但无论如何,我很高兴能澄清这个问题:)。如果回答有帮助的话,请考虑投票或投票。
f = filter(lambda x: x in b, a)