如何通过平均分配给定的数字来创建N个大小的列表?



例如,如果给定的数字是12,我想要4列表,每个列表的大小都是3

同样,如果数字为:

  • 13,列表大小为3,3,3,4
  • 14,大小为3,3,4,4,依此类推

列表的数量是固定的。

您可以使用range()编写列表推导式获取所需的列表如下:

group = 4       # Number of groups in which you want to distribute the number
num  = 14       # Your number (to distribute)
default = None  # Default value you want to insert into your lists
my_list = [[None for _ in range((num//group) + ((num%group)>=g))] for g in range(group, 0, -1)]

返回my_list为:

[
[None, None, None], 
[None, None, None], 
[None, None, None, None], 
[None, None, None, None]
]

最好编写一个自定义函数来获取所需列表的大小:

def get_list_sizes(num, group):
return [(num//group) + (num%group>=g) for g in range(group, 0, -1)]
# OR, a generator:
# def get_list_sizes(num, group):
#     for g in range(group, 0, -1):
#         yield num//group + (num%group>=g)

然后在嵌套的列表推导式中迭代上述函数返回的大小以获得所需的列表。示例测试运行:

group, num, default = 4, 14, None
my_list = [[default for _ in range(n)] for n in get_list_sizes(num, group)]
# [[None, None, None], [None, None, None], [None, None, None, None], [None, None, None, None]]
group, num, default = 5, 13, None
my_list = [[default for _ in range(n)] for n in get_list_sizes(num, group)]
# [[None, None], [None, None], [None, None, None], [None, None, None], [None, None, None]]

可以使用itertools.repeat()进一步简化:

from itertools import repeat
group, num, default = 5, 13, None
my_list = [list(repeat(default, n)) for n in get_list_sizes(num, group)]
# [[None, None], [None, None], [None, None, None], [None, None, None], [None, None, None]]

最新更新