Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def gen1():
- for item in range(1, 10, 2):
- yield item
- def gen2():
- for item in range(2, 20, 2):
- yield item
- def gen3():
- for item in range(40, 50, 2):
- yield item
- def merge_generators(gen1, gen2):
- """Live coding."""
- gen1_run = True
- gen2_run = True
- stop1 = False
- stop2 = False
- while True:
- try:
- if gen1_run:
- value1 = next(gen1)
- except StopIteration:
- stop1 = True
- try:
- if gen2_run:
- value2 = next(gen2)
- except StopIteration:
- stop2 = True
- gen1_run = True
- gen2_run = True
- if stop1 and stop2:
- break
- elif stop1:
- yield value2
- elif stop2:
- yield value1
- else:
- if value1 < value2:
- yield value1
- gen2_run = False
- else:
- yield value2
- gen1_run = False
- def merge_2(*generators):
- """Not live coding."""
- # Generator, Should I run?, Current value
- matrix = [
- [gen, True, None] for gen in generators
- ]
- while matrix:
- for i, row in enumerate(matrix):
- if row[1] is True:
- try:
- row[2] = next(row[0])
- row[1] = False
- except StopIteration:
- matrix.pop(i)
- if matrix:
- lowest = min(matrix, key=lambda row: row[2])
- yield lowest[2]
- lowest[1] = True
- def merge_3(*generators):
- """Shorter way."""
- # Generator, Should I run?, Current value
- matrix = [
- [gen, next(gen)] for gen in generators
- ]
- while matrix:
- lowest = min(matrix, key=lambda row: row[1])
- yield lowest[1]
- try:
- lowest[1] = next(lowest[0])
- except StopIteration:
- matrix = list(filter(lambda e: e != lowest, matrix))
- merge_gener = merge_3(gen1(), gen2(), gen3())
- print([i for i in merge_gener])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement