为什么我无法将过滤器对象转换为列表[重复]

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

我在将过滤器对象转换为列表时遇到麻烦,而它可以转换为集合

list_nums_2 = [2, 4, 5, 9, 8, 7, 6, 3, 1, 0]
evens = filter(lambda a: a % 2 == 0, list_nums_2)
print(set(evens))  # Out: {0, 2, 4, 6, 8}
print(list(evens)) # Out: []

我知道这不是因为它已经转换为集合,从下面很明显集合可以转换为列表

set_1 = {2, 3, 4, 5, 6}

print(list(set_1))  # Out: [2, 3, 4, 5, 6]
python python-3.x
1个回答
8
投票

当您运行

set(evens)
时,它消耗了
filter
对象中的所有项目。因此,当您执行
list(evens)
时没有可用的项目,并返回空列表。

filter
对象是一个迭代器,它是可迭代的,因此您可以在其上调用
next()
来获取下一项:

>>> evens = filter(lambda a: a % 2 == 0, list_nums_2)
>>> evens
<filter object at 0x7f2f4c309710>
>>> next(evens)
2
>>> next(evens)
4
>>> next(evens)
8
>>> next(evens)
6
>>> next(evens)
0
>>> next(evens)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

例外是因为

filter
对象中没有更多项目。

© www.soinside.com 2019 - 2024. All rights reserved.