有没有办法创建一个迭代器,以便重复列表中的元素一定次数?例如,给定一个列表:
color = ['r', 'g', 'b']
有没有一种方法可以创建一个迭代器,形式为
itertools.repeatlist(color, 7)
,可以生成以下列表?color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']
有没有办法创建一个迭代器,以便重复列表中的元素一定次数?例如,给定一个列表:
color = ['r', 'g', 'b']
itertools.repeatlist(color, 7)
,可以生成以下列表?color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']
您可以使用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']
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))]
itertools.cycle
接受一个可能只能迭代一次的生成器(例如map
对象)作为iterable
参数。一旦它被耗尽,就不能再从中获取元素了。因此,您的cycle
将永远无法再到达yield x
,这使得它成为一个无限循环。请尝试print(*islice(cycle(map(int, "123")), 20))
。 - Escape0707