Retrieve a list of generators in a circular fashion

I have a list of generator functions, for example:

def myGen(x): for i in range(x): yield i g5 = myGen(5); g10 = myGen(10); g15 = myGen(15) cycleList = [g5, g10, g15] 

What is the best way to cycle between these generators and remove those that are exhausted from the list?

The output should be:

 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 6 6 7 7 8 8 9 9 10 11 12 13 14 
+5
source share
2 answers

It looks like you want a roundrobin itertools recipe :

 def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> ADEBFC" # Recipe credited to George Sakkis pending = len(iterables) nexts = cycle(iter(it).next for it in iterables) while pending: try: for next in nexts: yield next() except StopIteration: pending -= 1 nexts = cycle(islice(nexts, pending)) 

Using:

 >>> from itertools import cycle, islice >>> for i in roundrobin(xrange(5), xrange(10), xrange(15)): print i, 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 6 6 7 7 8 8 9 9 10 11 12 13 14 
+5
source

the round robin recipe is the best way to go, but you can also use chain izip_longest and ifilterfalse :

 from itertools import chain, izip_longest, ifilterfalse for x in ifilterfalse(lambda x: x is None,chain.from_iterable(izip_longest(*cycleList))): print x, 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 6 6 7 7 8 8 9 9 10 11 12 13 14 

If you can have None as an object using values:

 my_object = object for x in ifilterfalse(lambda x: x is my_object,chain.from_iterable(izip_longest(*cycleList,fillvalue=my_object))): print x, 
+2
source

Source: https://habr.com/ru/post/1207395/


All Articles