How to join two generators in Python?
I want to change the following code
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
to this code:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
I get the error:
unsupported operand type(s) for +: 'generator' and 'generator'
How to join two generators in Python?
Solution 1:
itertools.chain()
should do it.
It takes a list of iterables and yields from each one by one
def chain(*iterables):
for it in iterables:
for element in it:
yield element
Usage example:
from itertools import chain
generator = chain('ABC', 'DEF')
for item in generator:
print(item)
Output:
A
B
C
D
E
F
Solution 2:
A example of code:
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
Solution 3:
In Python (3.5 or greater) you can do:
def concat(a, b):
yield from a
yield from b
Solution 4:
Simple example:
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
Solution 5:
With itertools.chain.from_iterable you can do things like:
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)