13

リストのN個のコピーを実際にメモリに保存しないように、イテレータを介してリストを繰り返し(N回)循環させたいと思います。独自のジェネレーターを作成せずにこれを行う組み込みまたはエレガントな方法はありますか?

理想的には、 itertools.cycle(my_list) には、循環する回数を制限するための 2 番目の引数があります... 残念ながら、そのような運はありません。

4

6 に答える 6

21
import itertools
itertools.chain.from_iterable(itertools.repeat([1, 2, 3], 5))

Itertoolsは素晴らしいライブラリです。:)

于 2012-04-26T00:08:35.440 に答える
12

他のすべての答えは素晴らしいです。別の解決策は、を使用すること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]
于 2012-04-26T00:26:30.267 に答える
8
itertools.chain.from_iterable(iter(L) for x in range(N))
于 2012-04-26T00:07:23.660 に答える
6

リストを数回繰り返す必要がある特別なケースでは、これはそれほど悪くありません。

nへの参照のリストを作成するmy_listため、nが非常に大きい場合は、ダースフェルトの回答を使用することをお勧めします

>>> import itertools as it
>>> it.chain(*[my_list]*n)
于 2012-04-26T00:14:06.613 に答える
5

独自のジェネレーターを作成したくないとおっしゃいましたが、ジェネレーター式はおそらく、目的を達成するための最も簡単で効率的な方法です。関数呼び出しやモジュールのインポートは必要ありません。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)
于 2012-04-26T01:36:25.967 に答える