首页 > 解决方案 > 根据定义的总和限制拆分项目列表

问题描述

我正在寻找以下解决方案:

oList = [400,250,750,800,125,500,550,100]
limit = 1000
list1 = []
nList = []
li = 0
for v in oList:
    li += v
    if li > limit:
        nList.append(v)
        list1 = set(oList) - set(nList)   

print(list1)

list1 [400, 250]

我正在寻找的是:

list1 [400, 250]
list2 [750]
list3 [800]
list4 [125, 500]
list5 [550, 100]

因此,列表列表就足够了,谢谢。

标签: python

解决方案


您在正确的轨道上,当前总和确定是否应将元素附加到列表中(重复调用 sum() 会使解决方案变慢)。但是,要获取列表列表,您需要在追加新子列表(并重置总数)或追加到列表列表中的最后一个列表之间进行选择。

你可以这样做:

def splitsum(L,S):
    result,t = [[]],0
    for n in L:
        r,v,t = (result,[n],n) if t+n>S else (result[-1],n,t+n)
        r.append(v) # append n to last list or [n] to list of lists
    return result

输出:

L = [400,250,750,800,125,500,550,100]
print(splitsum(L,1000))

[[400, 250], [750], [800, 125], [500], [550, 100]]

推荐阅读