问题
I have two generators say A() and B(). I want to iterate over both the generators together. Something like:
for a,b in A(),B(): # I know this is wrong
#do processing on a and b
One way is to store the results of both the functions in lists and then loop over the merged list. Something like this:
resA = [a for a in A()]
resB = [b for b in B()]
for a,b in zip(resA, resB):
#do stuff
If you are wondering, then yes both the functions yield equal number of value.
But I can't use this approach because A()/B() returns so many values. Storing them in a list would exhaust the memory, that's why I am using generators.
Is there any way to loop over both the generators at once?
回答1:
You were almost there. In Python 3, just pass the generators to zip():
for a, b in zip(A(), B()):
zip() takes any iterable, not just lists. It will consume the generators one by one.
In Python 2, use itertools.izip():
from itertools import izip
for a, b in izip(A(), B()):
As an aside, turning a generator into a list is as simple as list(generator); no need to use a list comprehension there.
回答2:
Sounds like you want itertools.izip:
from itertools import izip
for a, b in izip(A(), B()):
From the docs:
Like
zip()except that it returns an iterator instead of a list.
So this way you never create a list, either of A(), B() or the izip().
Note that in Python 3's basic zip is like Python 2.x's itertools.izip.
回答3:
You can use the zip function to transform the two lists generated into an list of tuples, so you can use the way you want:
for a,b in zip(A(), B()):
pass
来源:https://stackoverflow.com/questions/20910213/loop-over-two-generator-together