是否可以不迭代将列表转换为生成器?

38 投票
5 回答
51706 浏览
提问于 2025-04-16 17:16

我知道可以把生成器转换成列表,这个过程比较简单,比如用 list(i for i in xrange(10)) 这样的写法。但是,有没有办法在不先遍历列表的情况下,把列表变回生成器呢?比如像 (i for i in range(10)) 这样?

编辑:为了更清楚我想表达的意思,我把“cast”这个词去掉了。

编辑 2:其实,我觉得我可能对生成器的理解有点偏差。看来我应该等喝完早咖啡再来发问题!

5 个回答

9

确实,一个列表可以拥有迭代器的接口:

list_iter = list.__iter__() # or iter(list), returns list iterator
list_iter.__next__() # list_iter.next() for python 2.x

所以,

lst_iter = iter(lst)

这样就可以实现了。

不过,使用列表推导式(comprehensions)来创建一个生成器会更合理,比如:

lst_iter_gt_10 = (item for item in lst if item > 10)
15

你可以通过使用内置的函数 list(...) 从一个迭代器中提取出一个列表,而从一个列表中提取出迭代器则可以使用 iter(...)

mylist = list(myiterator)
myiterator = iter(mylist)

实际上,你的语法 确实 是一个迭代器:

iter_10 = (i for i in range(10))

而不是使用 [...],那样会得到一个列表。

可以看看这个回答 Python 的隐藏特性

56

试试这个:an_iterator = iter(a_list) ... 文档在这里。这就是你想要的吗?

撰写回答