2014-11-21 35 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,