Python通过lis求和和分组

2024-09-27 21:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一大串的数字,比如:

a = [133000, 126000, 123000, 108000, 96700, 96500, 93800, 
 93200, 92100, 90000, 88600, 87000, 84300, 82400, 80700,
 79900, 79000, 78800, 76100, 75000, 15300, 15200, 15100,
 8660, 8640, 8620, 8530, 2590, 2590, 2580, 2550, 2540, 2540, 
 2510, 2510, 1290, 1280, 1280, 1280, 1280, 951, 948, 948,
 947, 946, 945, 609, 602, 600, 599, 592, 592, 592, 591, 583]  

我想做的是在这个列表中逐个循环检查一个值是否高于某个阈值(例如40000)。如果它高于这个阈值,我们就把这个值放到一个新的列表中,然后忘掉它。否则,我们会等到值的总和超过阈值,然后将值放入列表中,然后继续循环。最后,如果最终值的和不到阈值,我们就把它们添加到最后一个列表中。你知道吗

如果我不清楚,考虑一个简单的例子,阈值是15

[20, 10, 9, 8, 8, 7, 6, 2, 1]

最终列表应如下所示:

[[20], [10, 9], [8, 8], [7, 6, 2, 1]]

我的数学和python真的很差,我已经不知所措了。我想出了一些基本的代码,但实际上不起作用:

def sortthislist(list):
    list = a
    newlist = []
    for i in range(len(list)):
        while sum(list[i]) >= 40000:
            newlist.append(list[i])
    return newlist

任何帮助都将不胜感激。抱歉,邮件太长了。你知道吗


Tags: 代码in列表fordefrange阈值数字
3条回答

下面的函数将接受您的输入列表和一些要检查的限制,然后输出排序的列表:

a = [20, 10, 9, 8, 8, 7, 6, 2, 1]

def func(a, lim):
    out = []
    temp = []
    for i in a:
        if i > lim:
            out.append([i])
        else:
            temp.append(i)
            if sum(temp) > lim:
                out.append(temp)
                temp = []
    return out

print(func(a, 15))
# [[20], [10, 9], [8, 8], [7, 6, 2, 1]]

使用Python,您可以迭代列表本身,而不是迭代它的索引,因此您可以看到我使用for i in a而不是for i in range(len(a))。你知道吗

在函数out中,是要在末尾返回的列表;temp是一个临时列表,用数字填充,直到temp的和超过lim的值,此时这个temp被附加到out并替换为空列表。你知道吗

希望这能有所帮助:)

vlist = [20, 10,3,9, 7,6,5,4]

thresold = 15

result = []
tmp = []
for v in vlist:
    if v > thresold:
        tmp.append(v)
        result.append(tmp)
        tmp = []
    elif sum(tmp) + v > thresold:
        tmp.append(v)
        result.append(tmp)
        tmp = []
    else:
        tmp.append(v)

if tmp != []:
    result.append(tmp)

结果是:

[[20], [10, 3, 9], [7, 6, 5], [4]]
def group(L, threshold):
    answer = []
    start = 0
    sofar = L[0]
    for i,num in enumerate(L[1:],1):
        if sofar >= threshold:
            answer.append(L[start:i])
            sofar = L[i]
            start = i
        else:
            sofar += L[i]
    if i<len(L) and sofar>=threshold:
        answer.append(L[i:])
    return answer

输出:

In [4]: group([20, 10, 9, 8, 8, 7, 6, 2, 1], 15)
Out[4]: [[20], [10, 9], [8, 8], [7, 6, 2]]

相关问题 更多 >

    热门问题