有没有办法创建一个迭代器来重复某些列表中的元素?例如,列出了一个列表:
color = ['r', 'g', 'b']
有没有办法以itertools.repeatlist(color, 7)
的形式创建一个可以生成以下列表的迭代器?
color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']
答案 0 :(得分:10)
您可以将itertools.cycle()
与itertools.islice()
一起使用来构建repeatlist()
功能:
from itertools import cycle, islice
def repeatlist(it, count):
return islice(cycle(it), count)
这将返回一个新的迭代器;如果你必须有一个列表对象,请在其上调用list()
。
演示:
>>> from itertools import cycle, islice
>>> def repeatlist(it, count):
... return islice(cycle(it), count)
...
>>> color = ['r', 'g', 'b']
>>> list(repeatlist(color, 7))
['r', 'g', 'b', 'r', 'g', 'b', 'r']
答案 1 :(得分:0)
cycle
的文档中说:
请注意,工具箱的此成员可能需要大量辅助存储(取决于迭代对象的长度)。
我很好奇为什么python无法提供更有效的实现:
def cycle(it):
while True:
for x in it:
yield x
def repeatlist(it, count):
return [x for (i, x) in zip(range(count), cycle(it))]
这样,您无需保存列表的整个副本。如果list无限长也可以使用。
答案 2 :(得分:-1)
尝试:
def repeat_list(l, n):
for i in range(n): yield l[i%len(l)]