是否有一种优雅的方式通过迭代循环遍历列表N次(如itertools.cycle但限制循环)?

JJC*_*JJC 12 python iterator

我想通过迭代器重复遍历列表(N次),以便不在列表中实际存储N个副本.有没有内置或优雅的方式来做到这一点,而无需编写自己的发电机?

理想情况下,itertools.cycle(my_list)会有第二个参数来限制它循环的次数...唉,没有这样的运气.

Cas*_*all 17

import itertools
itertools.chain.from_iterable(itertools.repeat([1, 2, 3], 5))
Run Code Online (Sandbox Code Playgroud)

Itertools是一个很棒的图书馆.:)


Ign*_*ams 8

itertools.chain.from_iterable(iter(L) for x in range(N))
Run Code Online (Sandbox Code Playgroud)


sen*_*rle 7

所有其他答案都非常好.另一种解决方案是使用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]
Run Code Online (Sandbox Code Playgroud)

  • @Darthfett,是的,确实如此。但这与这里无关。`cycle`返回的可迭代对象是无限长的。 (2认同)

Joh*_*ooy 6

对于需要多次遍历列表的特殊情况,这不是太糟糕.

它确实创建了一个n引用列表my_list,所以如果n非常大,最好使用Darthfelt的答案

>>> import itertools as it
>>> it.chain(*[my_list]*n)
Run Code Online (Sandbox Code Playgroud)


Mat*_*son 5

您说过,您不想编写自己的生成器,但是生成器表达式可能是完成所要完成的事情的最简单,最有效的方法。它不需要任何函数调用或任何模块的导入。itertools是一个很好的模块,但在这种情况下可能不是必需的?

some_list = [1, 2, 3]
cycles = 3
gen_expr = (elem for _ in xrange(cycles) for elem in some_list)
Run Code Online (Sandbox Code Playgroud)

要不就

(elem for _ in xrange(3) for elem in [1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

要么

for elem in (e for _ in xrange(3) for e in [1, 2, 3]):
    print "hoo-ray, {}!".format(elem)
Run Code Online (Sandbox Code Playgroud)