如何在Python中join两个生成器?
我想更改下面的代码
for directory, dirs, files in os.walk(directory_1): do_something() for directory, dirs, files in os.walk(directory_2): do_something()
到这个代码:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2): do_something()
我得到的错误:
不支持的操作数types为+:'generator'和'generator'
我的问题是,如何在Python中join两个生成器?
非常感谢你!
我认为itertools.chain()
应该这样做。
代码示例:
from itertools import chain def generator1(): for item in 'abcdef': yield item def generator2(): for item in '123456': yield item generator3 = chain(generator1(), generator2()) for item in generator3: print item
通过itertools.chain.from_iterable,你可以做如下的事情:
def genny(start): for x in range(start, start+3): yield x y = [1, 2] ab = [o for o in itertools.chain.from_iterable(genny(x) for x in y)] print(ab)
简单的例子:
from itertools import chain x = iter([1,2,3]) #Create Generator Object (listiterator) y = iter([3,4,5]) #another one result = chain(x, y) #Chained x and y
如果你想保持生成器分离,但仍然可以在同一时间迭代它们,你可以使用zip():
注意:迭代停在两个发生器中较短的一个上
例如:
for (root1, dir1, files1), (root2, dir2, files2) in zip(os.walk(path1), os.walk(path2)): for file in files1: #do something with first list of files for file in files2: #do something with second list of files
让我们说,我们必须发电机(gen1和gen 2),我们要执行一些额外的计算,需要两者的结果。 我们可以通过map方法返回这个函数/计算的结果,然后返回一个我们可以循环的生成器。
在这种情况下,函数/计算需要通过lambda函数来实现。 棘手的部分是我们的目标是在地图和lambda函数中做什么。
build议解决scheme的一般forms:
def function(gen1,gen2): for item in map(lambda x, y: do_somethin(x,y), gen1, gen2): yield item