我运行了以下代码:
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
答案 0 :(得分:4)
是的,itertools.count
旨在永不停止计算。这就是为什么它会返回一个iterator,它会按需生成项目,而不是一次生成所有项目。
但是,这部分代码:
[y for y in itertools.count()]
有效地告诉Python将itertools.count
生成的无限数量的数字放入单个列表中。因此,引发MemoryError
,因为此操作会立即占用所有可用内存。
您只需删除列表解析 1 :
即可解决问题>>> 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()
返回的迭代器,现在只生成所需数量的数字。
1 我也删除了你的其他列表理解,因为它是不必要的:my_list
已经是可迭代的,因为它是一个列表。
答案 1 :(得分:0)
为什么不呢?
for a,b in enumerate(my_list):
print (b, a)