Python 迭代器中如何重复列表元素

7

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

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

有没有一种方法可以创建一个迭代器,形式为itertools.repeatlist(color, 7),可以生成以下列表?
color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']

在你提问之前,你是否真的尝试阅读过 itertools 的文档? - Padraic Cunningham
1
@PadraicCunningham:请注意,另一个问题执行完整循环重复;因此,这里的OP将需要满足于3的倍数。 - Martijn Pieters
1
@MartijnPieters,https://dev59.com/ymkv5IYBdhLWcg3wzkHa#10325689,这个答案与您的回答几乎完全相同。 - Padraic Cunningham
@PadraicCunningham:没错,我漏掉了那个。但是这里的问题已经足够不同了,从技术上讲,那个答案对于那个问题是错误的。 - Martijn Pieters
这个回答解决了你的问题吗?Python中的循环列表迭代器 - Tomerikoo
2个回答

18

您可以使用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']

太棒了,正是我想要的!谢谢! - zhaodaolimeng

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

这样,您就不需要保存整个列表的副本。如果列表是无限长的,则此方法也适用。

1
因为itertools.cycle接受一个可能只能迭代一次的生成器(例如map对象)作为iterable参数。一旦它被耗尽,就不能再从中获取元素了。因此,您的cycle将永远无法再到达yield x,这使得它成为一个无限循环。请尝试print(*islice(cycle(map(int, "123")), 20)) - Escape0707

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接