一起循环两个发电机

Abh*_*pta 20 python loops for-loop yield generator

我有两个发电机说A()B().我想一起迭代两个生成器.就像是:

for a,b in A(),B():    # I know this is wrong
    #do processing on a and b
Run Code Online (Sandbox Code Playgroud)

一种方法是将两个函数的结果存储在列表中,然后遍历合并列表.像这样的东西:

resA = [a for a in A()]
resB = [b for b in B()]
for a,b in zip(resA, resB):
    #do stuff
Run Code Online (Sandbox Code Playgroud)

如果您想知道,那么两个函数都会产生相同数量的值.

但是我不能使用这种方法因为A()/B()返回了这么多的值.将它们存储在列表中会耗尽内存,这就是我使用生成器的原因.

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

Mar*_*ers 31

你快到.在Python 3中,只需将生成器传递给zip():

for a, b in zip(A(), B()):
Run Code Online (Sandbox Code Playgroud)

zip()采用任何可迭代的,而不仅仅是列表.它将逐个消耗发电机.

在Python 2中,使用itertools.izip():

from itertools import izip

for a, b in izip(A(), B()):
Run Code Online (Sandbox Code Playgroud)

顺便说一句,将发电机变成列表就像这样简单list(generator); 不需要在那里使用列表理解.

  • @adsmith:事实并非如此.它产生`(1,4)`,`(2,5)`和`(3,6)`.你在考虑`itertools.product()`. (2认同)