2014-11-21 4 views
5

Ich habe eine Liste von Generatorfunktionen wie:Auspuff eine Liste von Generatoren in einer zyklischen Weise

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

Was ist der beste Weg zwischen diesen Generatoren zu Zyklus und diejenigen entfernen, die aus der Liste erschöpft sind?

sollte die Ausgabe sein:

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 

Antwort

5

Es sieht aus wie Sie das wollen roundrobinitertools recipe:

def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # 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)) 

Im Einsatz:

>>> 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 
2

das Round-Robin-Rezept ist ein besserer Weg, zu gehen, aber Sie könnten auch chainizip_longest und verwenden 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 

Wenn Sie Keine als Wert Verwendung Objekt haben kann:

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