我有两个生成器A()
和B()
。我想一起迭代两个生成器。类似的东西:
for a,b in A(),B(): # I know this is wrong
#do processing on a and b
一种方法是将两个函数的结果存储在列表中,然后遍历合并列表。像这样:
resA = [a for a in A()]
resB = [b for b in B()]
for a,b in zip(resA, resB):
#do stuff
如果您想知道,那么两个函数都会产生相同数量的值。
但是我不能使用这种方法,因为A()/B()
返回了这么多的值。将它们存储在列表中会耗尽内存,这就是我使用生成器的原因。
有没有办法一次循环两个发电机?
答案 0 :(得分:30)
你几乎那里。在Python 3中,只需将生成器传递给zip()
:
for a, b in zip(A(), B()):
zip()
采用任何可迭代的,而不仅仅是列表。它将逐个消耗生成器。
在Python 2中,使用itertools.izip()
:
from itertools import izip
for a, b in izip(A(), B()):
顺便说一句,将生成器转换为列表就像list(generator)
一样简单;不需要在那里使用列表理解。
答案 1 :(得分:3)
听起来像你想要的itertools.izip
:
from itertools import izip
for a, b in izip(A(), B()):
来自文档:
与
zip()
类似,只是它返回迭代器而不是列表。
因此,您永远不会创建list
,A()
,B()
或izip()
。
请注意,在Python 3中,基本zip
与Python 2.x的itertools.izip
类似。
答案 2 :(得分:0)
您可以使用zip函数将生成的两个列表转换为元组列表,以便您可以按照自己的方式使用:
for a,b in zip(A(), B()):
pass