python3中过滤后列表内容消失是什么原因?

问题描述 投票:0回答:1

我使用的是python 3.6.9。

从3.x版本开始,内置函数filter()返回的是一个可迭代的filter对象,而不是一个list。在第一个例子中,我在list上使用了consequtive filter,而没有将filter对象转换为list。

>>> test1 = lambda n: n%2
>>> test2 = lambda n: n%3
>>>
>>> my_list = [1, 2, 3, 4, 5]
>>> filtered1 = filter(test1, my_list)
>>> filtered2 = filter(test2, filtered1)

这样一来,filtered2就会产生1和5,这是我们想要的。在第二个例子中,我尝试用过滤后的迭代对象覆盖my_list变量,然后以同样的方式进入下一个过滤器。

>>> my_list = [1, 2, 3, 4, 5]
>>> my_list = filter(test1, my_list)
>>> my_list = filter(test2, my_list)

第二行中的my_list产生了1,3,5,这是预期的。但是,第三行中的my_list是空的。

>>> list(my_list)
[]

关于filter状态的文档。

请注意,filter(function, iterable) 等同于生成器表达式(iterable中的 item for item in iterable if function(it item))

于是我做了一个尝试。

>>> my_list = [1, 2, 3, 4, 5]
>>> my_list = (item for item in my_list if test1(item))
>>> my_list = (item for item in my_list if test2(item))

这样一来,my_list最后产生的是1,5,所以不是等价的。 是什么原因导致第二个例子中my_list的内容消失?

python-3.x filter iterator iterable
1个回答
0
投票

似乎当你实现方法2时,你试图用filter()的结果覆盖my_list变量;当你在步骤2中检查my_list的值时,你用尽了迭代器my_list。

然后在step3中,你是将空迭代器传递给filter方法,因此输出迭代器也是空的。

下面,我试着在不穷尽list变量的情况下实现同样的方法,得到了想要的输出。

>>> a = [1,2,3,4,5,6]
>>> a = filter(test1, a)
>>> a = filter(test2, a)
>>> f(a)
1
5
>>> f(a)
>>>

f()只是一个打印迭代器的函数.请注意我第一次使用f(a)通过循环遍历迭代器来穷尽我的迭代器.下一次我尝试这样做时,迭代器是空的.

>>> def f(obj):
...     for i in obj:
...             print(i)
...
© www.soinside.com 2019 - 2024. All rights reserved.