我有两个生成器,分别是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()
返回的值太多。将它们存储在列表中会耗尽内存,这就是我使用生成器的原因。
是否有办法同时在两台发电机上进行循环?
你几乎在那里。在Python 3中,只需将生成器传递给
zip()
:zip()
接受任何iterable,而不仅仅是列表。它将逐一消耗发电机。在Python 2中,使用^{} :
另外,将生成器转换为列表非常简单,不需要使用列表理解。
听起来你想要^{} :
从文档中:
因此,这样就不会创建
list
,或者A()
、B()
或者izip()
。请注意,在Python3的basic
zip
中,类似于Python2.x的itertools.izip
。可以使用zip函数将生成的两个列表转换为元组列表,这样就可以使用所需的方式:
相关问题 更多 >
编程相关推荐