我想通过迭代器重复遍历列表(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是一个很棒的图书馆.:)
所有其他答案都非常好.另一种解决方案是使用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)
对于需要多次遍历列表的特殊情况,这不是太糟糕.
它确实创建了一个n引用列表my_list,所以如果n非常大,最好使用Darthfelt的答案
>>> import itertools as it
>>> it.chain(*[my_list]*n)
Run Code Online (Sandbox Code Playgroud)
您说过,您不想编写自己的生成器,但是生成器表达式可能是完成所要完成的事情的最简单,最有效的方法。它不需要任何函数调用或任何模块的导入。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)
| 归档时间: |
|
| 查看次数: |
2089 次 |
| 最近记录: |