Python 如何从列表中创建给定长度的循环列表
我需要一份循环清单。我有5个标签的列表: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 = ["
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是最快的。