Добавляйте элементы в список, пока их сумма не превысит пороговое значение - PullRequest
4 голосов
/ 10 октября 2019

Из списка значений я хочу создать новый список значений, пока они не добавят значение.

Я новичок в Python, но считаю, что лучше всего это сделать с циклом while.

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

Ответы [ 6 ]

7 голосов
/ 10 октября 2019

numpy массивы делают это простым

import numpy as np

arr = np.array(L)
arr[arr.cumsum() <= 20].tolist()
#[1, 2, 3, 4, 5]
5 голосов
/ 10 октября 2019

Поскольку вы пометили панд:

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

Вывод:

array([1, 2, 3, 4, 5], dtype=int64)
3 голосов
/ 10 октября 2019

Сначала вы создаете пустой список, а затем добавляете значения с теми же условиями, которые вы указали. Наконец, печать списка вернет вам добавленные значения, соответствующие вашим критериям:

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)

Вывод:

[1, 2, 3, 4, 5]
1 голос
/ 10 октября 2019

Если мы говорим на pythonic, цикл for имеет больше смысла (также с использованием лучших имен переменных):

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

Но понимание также pythonic и короче:

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

Затем, чтобы получить сумму, просто используйте функцию sum:

total = sum(filtered)

Или, если вам нужна только сумма:

total = sum(n for n in data if n < 20)
0 голосов
/ 11 октября 2019

Вы можете легко написать свою собственную функцию генератора:

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)

Который дает

[1, 2, 3, 4, 5]
0 голосов
/ 10 октября 2019

Если бы вы суммировали от начала до конца (имо) более питонический путь был бы

s = 0
for element in L:
   if s + element < 20:
         s += element
    else:
         break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...