2014-11-21 15 views
5

發電機的名單我有這樣的發電機的功能列表:排氣循環方式

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

什麼是這些發電機之間循環的最佳方式刪除從列表中耗盡的人?

輸出應該是:

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

它看起來像你想的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)) 

在使用中:

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

循環賽食譜是一個更好的辦法去,但你也可以使用chainizip_longestifilterfalse

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 

如果可能無作爲值使用對象:

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