[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’에 대해 지원되지 않는 피연산자 유형

파이썬에서 두 생성기를 결합하는 방법?



답변

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


답변

Python (3.5 이상)에서는 다음을 수행 할 수 있습니다.

def concat(a, b):
    yield from a
    yield from b


답변

간단한 예 :

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


답변

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)


답변

여기 에 중첩 된 s 와 함께 생성기 표현식 을 사용하고 있습니다 for.

a = range(3)
b = range(5)
ab = (i for it in (a, b) for i in it)
assert list(ab) == [0, 1, 2, 0, 1, 2, 3, 4]


답변

unpack 연산자를 사용할 수도 있습니다 *.

concat = (*gen1(), *gen2())

참고 : ‘비 지연’반복에 가장 효율적으로 작동합니다. 다른 종류의 이해와 함께 사용할 수도 있습니다. 생성기 연결에 선호되는 방법은 @Uduse 의 답변입니다 .