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

问题描述 投票:0回答:2

有没有办法创建一个迭代器来重复列表中的元素一定次数?例如给出一个列表:

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

有没有办法创建

itertools.repeatlist(color, 7)
形式的迭代器,它可以产生以下列表?

color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']
python python-itertools
2个回答
17
投票

您可以使用

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
投票

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

这样,您不需要保存列表的整个副本。如果列表无限长,它就可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.