Python “拆分”;加权;将列表/数组分成大小相等的块

Python “拆分”;加权;将列表/数组分成大小相等的块,python,arrays,sorting,Python,Arrays,Sorting,我有一个项目数组,每个项目都有一个权重。我想把它分成大小相等的块,累积重量大约相等。这里有一个使用numpy实现这一点的答案 有没有一种简单的方法可以使用纯python实现这一点 示例阵列: [ ['bob',12], ['jack,6], ['jim',33], .... ] 或 这里正确的输出是(假设需要2个块) 及 为了进一步澄清问题,假设将100人分为10部电梯,我们希望每部电梯的总重量(该电梯中所有人的总重量)相同。因此,第一个列表将成为名称和权重。这是一个负载平衡问题。您需要这

我有一个项目数组,每个项目都有一个权重。我想把它分成大小相等的块,累积重量大约相等。这里有一个使用numpy实现这一点的答案 有没有一种简单的方法可以使用纯python实现这一点

示例阵列:

[ ['bob',12],
 ['jack,6],
 ['jim',33],
....
]

这里正确的输出是(假设需要2个块)


为了进一步澄清问题,假设将100人分为10部电梯,我们希望每部电梯的总重量(该电梯中所有人的总重量)相同。因此,第一个列表将成为名称和权重。这是一个负载平衡问题。

您需要这样的拆分:

 array =[ ['bob',12],
 ['jack',6],
 ['jim',33],
  ['bob2',1],
 ['jack2',16],
 ['jim2',3],
  ['bob3',7],
 ['jack3',6],
 ['jim3',1],
 ]


array = sorted(array, key= lambda pair: pair[1],  )

summ = sum(pair[1] for pair in array )

chunks = 4

splmitt = summ // chunks

print(array)

print(summ)

print(splmitt)

def split(array, split):

    splarr = []
    tlist = []
    summ = 0

    for pair in array:
        summ += pair[1] 
        tlist.append(pair)     
        if summ > split:
            splarr.append(tlist)
            tlist = []
            summ = 0


if tlist:
    splarr.append(tlist)
return splarr

spl = split(array, splmitt)

import pprint 

pprint.pprint(spl)

你只需要模仿cumsum:建立一个权重总和列表。最后你得到了总重量。用累计权重扫描列表,每次达到总权重/块数时创建一个新块。代码可以是:

 def split(w_list, n_chunks):
    # mimic a cumsum
    s = [0,[]]
    for i in w_list:
        s[0]+= i[1]
        s[1].append(s[0])
    # now scan the lists populating the chunks
    index = 0
    splitted = []
    stop = 0
    chunk = 1
    stop = s[0] / n_chunks
    for i in range(len(w_list)):
        # print(stop, s[1][i])     # uncomment for traces
        if s[1][i] >= stop:        # reached a stop ?
            splitted.append(w_list[index:i+1])    # register a new chunk
            index = i+1
            chunk += 1
            if chunk == n_chunks:                 # ok we can stop
                break
            stop = s[0] * chunk / n_chunks        # next stop
    splitted.append(w_list[index:])               # do not forget last chunk
    return splitted

你能分享一个更大的示例阵列吗?预期输出my_list=[“a”,“foo”,“booo”,“qooo”,“moo”,“doo”,“goo”]chunks=[my_list[x:x+2]对于范围内的x(0,len(my_list),2)],会起作用,它会将项目放入一个新的成对列表中-我不确定是否理解您的输入数据,请再次编辑以澄清。希望问题现在更清楚谢谢。除了一些拼写错误外,你的答案是正确的。
[c,5],[d,3],[e,3],[f,2] - cumulative weight of 13
 array =[ ['bob',12],
 ['jack',6],
 ['jim',33],
  ['bob2',1],
 ['jack2',16],
 ['jim2',3],
  ['bob3',7],
 ['jack3',6],
 ['jim3',1],
 ]


array = sorted(array, key= lambda pair: pair[1],  )

summ = sum(pair[1] for pair in array )

chunks = 4

splmitt = summ // chunks

print(array)

print(summ)

print(splmitt)

def split(array, split):

    splarr = []
    tlist = []
    summ = 0

    for pair in array:
        summ += pair[1] 
        tlist.append(pair)     
        if summ > split:
            splarr.append(tlist)
            tlist = []
            summ = 0


if tlist:
    splarr.append(tlist)
return splarr

spl = split(array, splmitt)

import pprint 

pprint.pprint(spl)
 def split(w_list, n_chunks):
    # mimic a cumsum
    s = [0,[]]
    for i in w_list:
        s[0]+= i[1]
        s[1].append(s[0])
    # now scan the lists populating the chunks
    index = 0
    splitted = []
    stop = 0
    chunk = 1
    stop = s[0] / n_chunks
    for i in range(len(w_list)):
        # print(stop, s[1][i])     # uncomment for traces
        if s[1][i] >= stop:        # reached a stop ?
            splitted.append(w_list[index:i+1])    # register a new chunk
            index = i+1
            chunk += 1
            if chunk == n_chunks:                 # ok we can stop
                break
            stop = s[0] * chunk / n_chunks        # next stop
    splitted.append(w_list[index:])               # do not forget last chunk
    return splitted