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