2014-11-21 7 views
5

Mam listę funkcji generatora jak:wydechowy listę wytwórców w cyklicznym mody

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

Jaki jest najlepszy sposób, aby przełączać między tymi generatorów i usunąć te, które zostały wykorzystane z listy?

Wyjście powinno być:

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 

Odpowiedz

5

Wygląda jak chcesz 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)) 

w użyciu:

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

rundy robin przepis jest lepszy sposób Aby przejść, ale można również użyć chainizip_longest i 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 

Jeśli można mieć None jako przedmiotu użycia wartość:

my_object = object 
for x in ifilterfalse(lambda x: x is my_object,chain.from_iterable(izip_longest(*cycleList,fillvalue=my_object))): 
     print x, 
Powiązane problemy