我运行了以下代码:
import itertools
my_list = ['a', 'b', 'c', 'd', 'e']
for i in itertools.izip([x for x in my_list], [y for y in itertools.count()]):
print i
基于documentation for izip,我预计它将返回一系列元组,在my_list
用尽时结束:(a,0)(b,1)(c,2)(d,3)(e,4)
相反,我得到下面复制的内存错误。似乎itertools.count()
函数返回无限数据,而不是仅限于my_list
中的5个记录?
line 50, in main
for i in itertools.izip([x for x in range(10)], [y for y in itertools.count()]): MemoryError
是的,itertools.count
旨在永不停止计数。这就是为什么它返回一个iterator,它按需生成物品而不是一次生成物品。
但是,这部分代码:
[y for y in itertools.count()]
有效地告诉Python将itertools.count
生成的无限数量的数字放入一个列表中。因此,引发MemoryError
,因为此操作立即消耗所有可用内存。
您只需删除列表comprehension1即可解决问题:
>>> import itertools
>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> for i in itertools.izip(my_list, itertools.count()):
... print i
...
('a', 0)
('b', 1)
('c', 2)
('d', 3)
('e', 4)
>>>
有了这个改变,itertools.izip
将迭代itertools.count()
返回的迭代器,现在只生成所需数量的数字。
1I我也删除了你的其他列表理解,因为它是不必要的:my_list
已经是可迭代的,因为它是一个列表。
为什么不呢?
for a,b in enumerate(my_list):
print (b, a)