如何在Python中合并两个生成器(或其他可迭代对象)?

273 投票
15 回答
147511 浏览
提问于 2025-04-16 01:02

我想把下面的代码

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

撰写回答