如何在Python中合并两个生成器(或其他可迭代对象)?
我想把下面的代码
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()
但是我遇到了这个错误:
不支持的操作类型:'generator' 和 'generator' 不能用 + 号相加
在Python中,怎么把两个生成器连接起来呢?
15 个回答
91
在Python(3.5或更高版本)中,你可以这样做:
def concat(a, b):
yield from a
yield from b
114
下面是一个代码示例:
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
360
itertools.chain()
可以解决这个问题。它可以接收多个可迭代对象(比如列表、元组等),然后一个接一个地从每个对象中取出元素,基本上等同于:
def chain(*iterables):
for it in iterables:
for element in it:
yield element
使用示例:
from itertools import chain
g = (c for c in 'ABC') # Dummy generator, just for example
c = chain(g, 'DEF') # Chain the generator and a string
for item in c:
print(item)
输出结果:
A
B
C
D
E
F