2016-07-16 9 views
2

私は値のリストを無期限に循環するジェネレータを必要とします。無限循環発生器を作成するためのきれいな方法はありますか?

私の解決策ですが、もっと明白な解決策がありません。

成分:無限にネストされたリストを平坦生成機能、およびリスト付随自体に

def ge(x): 
    for it in x: 
     if isinstance(it, list): 
      yield from ge(it) 
     else: 
      yield(it) 


def infinitecyclegenerator(l): 
    x = l[:] 
    x.append(x) 
    yield from ge(x) 

使用:

g = infinitecyclegenerator([1,2,3]) 

next(g) #1 
next(g) #2 
next(g) #3 
next(g) #1 
next(g) #2 
next(g) #3 
next(g) #1 
... 

私は些細に失われることがあり、前記したよう同じことをする方法と私は喜んで学ぶだろう。もっときれいな方法がありますか?

また、メモリ消費について心配する必要はありませんか?

答えて

7

あなたは反復子が反復可能から要素を返すと、それぞれの コピーを保存してください同じ結果

を達成するためにitertools.cycleを使用することができます。 iterableが使い果たされたら、 保存されたコピーから要素を返します。

強調鉱山。メモリに関する唯一の懸念は、イテレータによって返された各アイテムのコピーを保存することです。

>>> from itertools import cycle 
>>> c = cycle([1,2,3]) 
>>> next(c) 
1 
>>> next(c) 
2 
>>> next(c) 
3 
>>> next(c) 
1 
>>> next(c) 
2 
>>> next(c) 
3 
0

時間は:-)でなければなりません。投稿後に私が実現した1つの明白な方法:

def infinitecyclegenerator(l): 
    while True: 
     for it in l: 
      yield it 

関連する問題