リストのN個のコピーを実際にメモリに保存しないように、イテレータを介してリストを繰り返し(N回)循環させたいと思います。独自のジェネレーターを作成せずにこれを行う組み込みまたはエレガントな方法はありますか?
理想的には、 itertools.cycle(my_list) には、循環する回数を制限するための 2 番目の引数があります... 残念ながら、そのような運はありません。
import itertools
itertools.chain.from_iterable(itertools.repeat([1, 2, 3], 5))
Itertoolsは素晴らしいライブラリです。:)
他のすべての答えは素晴らしいです。別の解決策は、を使用することislice
です。これにより、任意の時点でサイクルを中断できます。
>>> from itertools import islice, cycle
>>> l = [1, 2, 3]
>>> list(islice(cycle(l), len(l) * 3))
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> list(islice(cycle(l), 7))
[1, 2, 3, 1, 2, 3, 1]
itertools.chain.from_iterable(iter(L) for x in range(N))
リストを数回繰り返す必要がある特別なケースでは、これはそれほど悪くありません。
n
への参照のリストを作成するmy_list
ため、n
が非常に大きい場合は、ダースフェルトの回答を使用することをお勧めします
>>> import itertools as it
>>> it.chain(*[my_list]*n)
独自のジェネレーターを作成したくないとおっしゃいましたが、ジェネレーター式はおそらく、目的を達成するための最も簡単で効率的な方法です。関数呼び出しやモジュールのインポートは必要ありません。itertools
は素晴らしいモジュールですが、この場合は必要ないのでしょうか?
some_list = [1, 2, 3]
cycles = 3
gen_expr = (elem for _ in xrange(cycles) for elem in some_list)
あるいは単に
(elem for _ in xrange(3) for elem in [1, 2, 3])
また
for elem in (e for _ in xrange(3) for e in [1, 2, 3]):
print "hoo-ray, {}!".format(elem)