Python idiom to chain (flatten) an infinite iterable of finite iterables? [duplicate]

StackOverflow https://stackoverflow.com/questions/120886

  •  02-07-2019
  •  | 
  •  

Question

This question already has an answer here:

Suppose we have an iterator (an infinite one) that returns lists (or finite iterators), for example one returned by

infinite = itertools.cycle([[1,2,3]])

What is a good Python idiom to get an iterator (obviously infinite) that will return each of the elements from the first iterator, then each from the second one, etc. In the example above it would return 1,2,3,1,2,3,.... The iterator is infinite, so itertools.chain(*infinite) will not work.

Related

Was it helpful?

Solution

Starting with Python 2.6, you can use itertools.chain.from_iterable:

itertools.chain.from_iterable(iterables)

You can also do this with a nested generator comprehension:

def flatten(iterables):
    return (elem for iterable in iterables for elem in iterable)

OTHER TIPS

Use a generator:

(item for it in infinite for item in it)

The * construct unpacks into a tuple in order to pass the arguments, so there's no way to use it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top