我有一个类似于以下列表的列表。
f = [[1],[10,3], [10,15,16,20]]
我想重复此列表一定次数。假设我希望列表的最终列表的长度为12。我可以执行以下操作,
from itertools import repeat, chain
s = list(repeat(f, 4))
这给了我
[[[1], [10, 3], [10, 15, 16, 20]],
[[1], [10, 3], [10, 15, 16, 20]],
[[1], [10, 3], [10, 15, 16, 20]],
[[1], [10, 3], [10, 15, 16, 20]]]
我现在可以使用链将列表列表中的列表转换为列表列表
d = list(chain(*s))
d给出
[[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20]]
d的长度为12。但这仅是因为12是3的倍数即可。如果我想重复20次或重复17次,则20/3 = 6.666667,并且repeat函数的第二个参数需要为整数怎么办?
答案 0 :(得分:1)
如果我了解您想做什么,那么您希望能够获得任意长度的列表列表,而不仅仅是输入的倍数。以下内容将为您提供一种动态获得所需结果的方法。
它查看输入的长度,并四舍五入为刚好高于所需数量的值。最后,它返回一个列表,其中仅包含您要查找的值的数量。
from itertools import chain, repeat, islice
import math
def my_func(list_of_lists, desired_amount):
scalar = math.ceil(desired_amount/len(list_of_lists))
s = repeat(list_of_lists, scalar)
d = chain.from_iterable(s)
return list(islice(d, desired_amount))
f = [[1],[10,3], [10,15,16,20]]
my_func(f, 20)
[[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3],
[10, 15, 16, 20],
[1],
[10, 3]]
len(my_func(f, 20))
20
使用简单语言的替代方法。
def my_func(list_of_lists, desired_amount):
l = len(list_of_lists)
multiplier = math.ceil(desired_amount/l)
s = list(repeat(list_of_lists, multiplier))
d = list(chain(*s))
return d[:desired_amount]