比如说,我有一个列表。
my_list = [1,2,3,4,5,6,7]
我想用组的ID创建另一个列表,比如说,如果我拆开了 my_list
分成2个组,组的ID列表是
group_id = [1,1,1,2,2,2,2]
其中最后一个组多了一个元素,这是因为 my_list
包含一个质数的元素。
这里是所有可能的拆分,从7组到1组。
group_id = [1,2,3,4,5,6,7] # 7 groups, 7 elements
group_id = [1,1,2,3,4,5,6] # 6 groups, 7 elements
group_id = [1,1,2,2,3,4,5] # 5 groups, 7 elements
group_id = [1,1,2,2,3,3,4] # 4 groups, 7 elements
group_id = [1,1,1,2,2,2,3] # 3 groups, 7 elements
group_id = [1,1,1,2,2,2,2] # 2 groups, 7 elements
group_id = [1,1,1,1,1,1,1] # 1 group, 7 elements.
问题是我不知道如何执行这个条件,即各组的大小必须大致相等。这必须适用于任何长度的列表(不仅仅是 7),并为我提供 group_id
给定组数的列表(从1到100)。len(my_list)
).
EDIT:
这似乎 "有点 "作用,虽然不完全。
import math
my_list = [1,2,3,4,5,6,7]
n_groups = 3
k = math.ceil(len(my_list)/n_groups)
chunks = [my_list[x:x+k] for x in range(0, len(my_list), k)]
group_id_nested = [[chunks.index(i)+1]*len(i) for i in chunks]
group_id = [item for sublist in group_id_nested for item in sublist]
如果你被允许使用 numpy
你可能会利用 numpy.linspace 该任务的方式如下。
import numpy as np
list_size = 7
for n in range(1,list_size+1):
group_ids = list(map(int,map(round,np.linspace(1,n,num=list_size))))
print(group_ids)
输出。
[1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 2, 2, 2, 2]
[1, 1, 2, 2, 2, 3, 3]
[1, 2, 2, 2, 3, 4, 4]
[1, 2, 2, 3, 4, 4, 5]
[1, 2, 3, 4, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
想法很简单: 我得到的是间距均匀的(浮点数)数字(list_size
其中)从 1
(含)至 n
(含)然后得到 最近的 的整数(注意使用 round
). 正如你所看到的,在每一行的输出中,任意两组大小之间的差异(给定数字的出现次数)总是等于或小于2。
如果没有numpy。
import math
listy = [1,2,3,4,5,6,7]
groupnum = 6
smallnum = math.floor(len(listy)/groupnum)
bignum = math.ceil(len(listy)/groupnum)
grouped = []
for c,e in enumerate(range(1,groupnum+1)):
if c<(len(listy)/groupnum - smallnum)*groupnum:
grouped+=[e]*bignum
else:
grouped+=[e]*smallnum
grouped=grouped[0:len(listy)]
print(grouped)
同样,它也会均匀地分配它们。例如,它可以做到 [1, 1, 2, 2, 3, 3, 4]
而不是 [1, 2, 2, 2, 3, 4, 4]
分为4组。