如何从列表创建给定长度的循环列表

How to create a circular list of a given length from a list

我需要一份循环清单。我有一个包含 5 个标签的列表:

taglist = ["faint", "shocking", "frosty", "loved", "sadness"]

我有另一个值单调递增的列表:

list = [1,2,3,4,5,6,7]

我想使用 taglist 创建另一个长度为 list 的列表。如果 list 有 7 个项目,我想要一个新的标签列表,如下所示。

newtaglist = ["faint", "shocking", "frosty", "loved", "sadness","faint", "shocking"]

并且这个列表将像循环填充一样继续下去。我该怎么做?

另外,在python中,list是内置函数,不要使用list作为变量名。

taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
print(len(taglist))
list_ = [1,2,3,4,5,6,7]
print(len(list_))

diff = len(list_) - len(taglist)

for i in range(0, diff):
  taglist.append(taglist[i])
print(taglist)

最简单的方法是使用专为此特定目的设计的 itertools.cycle

>>> from itertools import cycle, islice
>>> baselist = [1,2,3,4,5,6,7]
>>> taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
>>> list(islice(cycle(taglist), len(baselist)))
['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking']

另一种方法是乘以(重复)列表使其足够大,然后切掉多余的部分:

>>> baselist = [1,2,3,4,5,6,7]
>>> taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
>>> n = len(baselist)
>>> (taglist * -(n // -len(taglist)))[:n]
['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking']

双重否定用于将下限除法转换为上限除法,只要有余数就向上舍入。这确保列表乘法总是至少给出所需数量的元素。

newtaglist 可以使用模运算符生成,以确保索引在范围

taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
num_list = [1,2,3,4,5,6,7]
newtaglist = [taglist[i % len(taglist)] for i in xrange(len(num_list))]

产量:

['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking']

运行这here

其中 n 是所需的长度:

[taglist[i % len(taglist)] for i in range(n)]

或者你可以使用 Raymond 的建议

from itertools import cycle
infiniteTagList = cycle(taglist)
[next(infiniteTagList) for i in range(n)]

相乘加切片:

>>> taglist = ['a', 'b', 'c', 'd', 'e']
>>> length = 13
>>> 
>>> q, r = divmod(length, len(taglist))
>>> taglist * q + taglist[:r]
['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c']