Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python在迭代器中重复列表元素_Python_Itertools - Fatal编程技术网

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

python在迭代器中重复列表元素,python,itertools,Python,Itertools,有没有办法创建一个迭代器来重复列表中的元素?例如,给出了一个列表: color = ['r', 'g', 'b'] 有没有办法以itertools.repeatlist(color,7)的形式创建一个迭代器,它可以生成以下列表 color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r'] 您可以与一起使用来构建repeatlist()函数: from itertools import cycle, islice def repeatlist(it, co

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

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

color_list = ['r', 'g', 'b', 'r', 'g', 'b', 'r']
您可以与一起使用来构建
repeatlist()
函数:

from itertools import cycle, islice

def repeatlist(it, count):
    return islice(cycle(it), count)
这将返回一个新的迭代器;如果必须有列表对象,请对其调用
list()

演示:

您可以与一起使用来构建
repeatlist()
函数:

from itertools import cycle, islice

def repeatlist(it, count):
    return islice(cycle(it), count)
这将返回一个新的迭代器;如果必须有列表对象,请对其调用
list()

演示:


循环
的文档说明:

注意,工具箱的这个成员可能需要大量的辅助存储(取决于iterable的长度)

我很好奇为什么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))]

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

循环的文档说明:

注意,工具箱的这个成员可能需要大量的辅助存储(取决于iterable的长度)

我很好奇为什么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文档吗?@Padraiccningham:注意,另一个问题会重复整个周期;所以这里的OP需要满足于3的倍数。@MartijnPieters,,这与您自己的答案几乎相同。@Padraiccningham:对,我错过了那个。然而,这里的问题完全不同,从技术上讲,这个问题的答案是错误的。在你提出这个问题之前,你真的读过itertools文档吗?@Padraiccningham:注意,另一个问题确实会重复整个周期;所以这里的OP需要满足于3的倍数。@MartijnPieters,,这与您自己的答案几乎相同。@Padraiccningham:对,我错过了那个。然而,这里的问题完全不同,从技术上讲,这个问题的答案是错误的。因为
itertools.cycle
接受一个
iterable
,它可能是一个只能通过一次生成的生成器,例如
map
对象。一旦它耗尽,您就无法再从中获取元素。因此,您的
循环
将永远不会再次达到
收益率x
,这使其成为一个无限循环。尝试
print(*islice(cycle(map(int,“123”)),20))
,因为
itertools.cycle
接受一个
iterable
,它可能是一个只能通过一次生成的生成器,例如
map
对象。一旦它耗尽,您就无法再从中获取元素。因此,您的
循环
将永远不会再次达到
收益率x
,这使其成为一个无限循环。尝试打印(*islice(cycle(map(int,“123”)),20))