Add items in a list until their sum exceeds a threshold

*爱你&永不变心* 提交于 2020-04-28 08:52:52

问题


From a list of values I want to create a new list of values until they add up a value.

I am new with Python but I believe it is best done with a while loop.

L = [1,2,3,4,5,6,7,8,9]
i = 0
s = 0
while i < len(L) and s + L[i] < 20:
    s += L[i]
    i += 1

回答1:


numpy arrays make this simple

import numpy as np

arr = np.array(L)
arr[arr.cumsum() <= 20].tolist()
#[1, 2, 3, 4, 5]



回答2:


Since you tagged Pandas:

pd.Series(L, index=np.cumsum(L)).loc[:20].values

Output:

array([1, 2, 3, 4, 5], dtype=int64)



回答3:


You first create the empty list, and then append values with the same conditions you stated. Finally printing the list will return you the values that got added that match your criteria:

L = [1,2,3,4,5,6,7,8,9]
i = 0
s = 0
new_list = []
while i < len(L) and s + L[i] < 20:
    new_list.append(L[i])
    s += L[i]
    i += 1
print(new_list)

Output:

[1, 2, 3, 4, 5]



回答4:


If we’re talking pythonic, a for loop makes more sense (also using better variable names):

data = [1,2,3,4,5,6,7,8,9]
filtered = []
for num in data:
    if num < 20:
        filtered.append(num)

But a comprehension is also pythonic and shorter:

filtered = [num for num in data if num < 20]

Then to get the sum just use the sum function:

total = sum(filtered)

Or if you only need the sum:

total = sum(n for n in data if n < 20)



回答5:


You can easily write your own generator function:

L = [1,2,3,4,5,6,7,8,9]

def takeuntil(lst, max_value = 0):
    """Yields elements as long as the cummulative sum is smaller than max_value."""
    total = 0
    for item in lst:
        total += item
        if total <= max_value:
            yield item
        else:
            raise StopIteration

    raise StopIteration

new_lst = [item for item in takeuntil(L, 20)]
print(new_lst)

Which yields

[1, 2, 3, 4, 5]



回答6:


If you would sum from start to end the (imo) more pythonic way would be

s = 0
for element in L:
   if s + element < 20:
         s += element
    else:
         break


来源:https://stackoverflow.com/questions/58329194/add-items-in-a-list-until-their-sum-exceeds-a-threshold

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!