将两台发电机连在一起

2024-05-19 12:03:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

是否有办法同时在两台发电机上进行循环?


Tags: and方法函数in列表forison
3条回答

你几乎在那里。在Python 3中,只需将生成器传递给zip()

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

zip()接受任何iterable,而不仅仅是列表。它将逐一消耗发电机。

在Python 2中,使用^{}

from itertools import izip

for a, b in izip(A(), B()):

另外,将生成器转换为列表非常简单,不需要使用列表理解。

听起来你想要^{}

from itertools import izip

for a, b in izip(A(), B()):

从文档中:

Like zip() except that it returns an iterator instead of a list.

因此,这样就不会创建list,或者A()B()或者izip()

请注意,在Python3的basiczip中,类似于Python2.x的itertools.izip

可以使用zip函数将生成的两个列表转换为元组列表,这样就可以使用所需的方式:

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

相关问题 更多 >

    热门问题