一起循环两个发电机

时间:2014-01-03 18:18:49

标签: python loops for-loop generator yield

我有两个生成器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()返回了这么多的值。将它们存储在列表中会耗尽内存,这就是我使用生成器的原因。

有没有办法一次循环两个发电机?

3 个答案:

答案 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()类似,只是它返回迭代器而不是列表。

因此,您永远不会创建listA()B()izip()

请注意,在Python 3中,基本zip与Python 2.x的itertools.izip类似。

答案 2 :(得分:0)

您可以使用zip函数将生成的两个列表转换为元组列表,以便您可以按照自己的方式使用:

for a,b in zip(A(), B()):
    pass