通过指定组ID将一个列表分成若干组。

问题描述 投票:0回答:1

比如说,我有一个列表。

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]
python python-3.x list partition
1个回答
1
投票

如果你被允许使用 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。


0
投票

如果没有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组。

© www.soinside.com 2019 - 2024. All rights reserved.