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

Python 如何从列表中创建给定长度的循环列表,python,list,slice,itertools,circular-list,Python,List,Slice,Itertools,Circular List,我需要一份循环清单。我有5个标签的列表: taglist = ["faint", "shocking", "frosty", "loved", "sadness"] 我有另一个列表,它的值是单调递增的: list = [1,2,3,4,5,6,7] 我想使用taglist创建另一个列表,长度为list。如果list有7项,我需要一个新的标签列表,如下所示 newtaglist = ["

我需要一份循环清单。我有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)

另外,在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)
最简单的方法就是使用专门为此目的设计的工具

>>> 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']
双反运算用于将地板分割转换为天花板分割,只要有余数,天花板分割就会四舍五入。这可以确保列表乘法始终至少提供所需的元素数。

最简单的方法是使用它,它是为这个特殊目的而设计的

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

运行它

可以使用模运算符生成新标签列表
,以确保索引在范围内

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

运行它,其中n是所需的长度:

[taglist[i % len(taglist)] for i in range(n)]
或者你可以利用雷蒙德的建议

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

其中n为所需长度:

[taglist[i % len(taglist)] for i in range(n)]
或者你可以利用雷蒙德的建议

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

乘加切片:

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

虽然这不是问题,但如果他想在列表中循环多次,这将失败。我认为在循环之前添加一个
tag\u length=len(taglist)
,然后添加
taglist.append(taglist[I%tag\u length])
可能会解决这个问题。但我没有测试它。编辑类似的内容,但我认为这在列表中走错了方向…虽然这不在问题中,但如果他想在列表中循环多次,这将失败。我认为在循环之前添加一个
tag\u length=len(taglist)
,然后添加
taglist.append(taglist[I%tag\u length])
可能会解决这个问题。但我没有测试它。编辑类似的内容,但我认为这在列表中走错了方向…使用乘法方法对我来说很好,学习新事物的新方法。使用乘法方法对我来说很好,学习新事物的新方法。如果你关心运行时,这实际上是最慢的方法,大约比其他的慢10倍。谢谢repl的代码!因此,stefans使用divmod是最快的方法。如果你关心运行时,这实际上是最慢的方法,比所有其他方法慢10倍。感谢repl提供的代码!因此,stefans使用divmod是最快的。