如何从列表创建给定长度的循环列表
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']
我需要一份循环清单。我有一个包含 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']