给定长度为x的列表的列表,重复该操作即可得到长度为n的列表的列表

时间:2018-07-09 19:10:25

标签: python list

我有一个类似于以下列表的列表。

    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函数的第二个参数需要为整数怎么办?

1 个答案:

答案 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]