我知道可以将生成器转换为"低级"列表(例如。 list(i for i in xrange(10))
),但是是否可以在不先遍历列表的情况下进行相反的操作(例如。 (i for i in range(10))
)?
编辑:删除了cast
这个词,以明确我想要实现的目标。
编辑2:实际上,我认为我可能在根本层面上误解了生成器。这将教会我不要在早上喝咖啡之前发布如此多的问题!
试试这个: an_iterator = iter(a_list)
...文档在这里。这就是你想要的吗?
您可以使用内置函数 list(...)
从迭代器中取出列表,并使用 iter(...)
从列表中获取迭代器:
mylist = list(myiterator)
myiterator = iter(mylist)
事实上,你的语法是一个迭代器:
iter_10 = (i for i in range(10))
而不是使用给出列表的[...]
。
看看这个答案 Python 的隐藏功能
事实上,列表可能拥有迭代器接口:
list_iter = list.__iter__() # or iter(list), returns list iterator
list_iter.__next__() # list_iter.next() for python 2.x
所以
lst_iter = iter(lst)
能解决问题。
尽管使用推导并从中制作生成器更有意义:例如
lst_iter_gt_10 = (item for item in lst if item > 10)
我不确定你的意思,但你输入的是有效的 Python 代码:
>>> x = (i for i in range(10))
>>> x
<generator object at 0xb7f05f6c>
>>> for i in x: print i
0
1
2
3
4
5
6
7
8
9
接下来是关键:
next(iter([]), None)
您可以在其中将 None 替换为您想要的任何默认值