python重复迭代器中的列表元素

时间:2016-08-31 08:21:01

标签: python itertools

有没有办法创建一个迭代器来重复某些列表中的元素?例如,列出了一个列表:

color = ['r', 'g', 'b']

有没有办法以itertools.repeatlist(color, 7)的形式创建一个可以生成以下列表的迭代器?

color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']

3 个答案:

答案 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)]