2016-09-16 4 views
2

У меня есть старый список, и я хочу суммировать каждый отдельный элемент в новый список:Сумма всех список-элементы в новый список

lst_old = [1, 2, 3, 4, 5] 
    lst_new = [1, 3, 6, 10, 15] 

Есть элегантный способ реализации, что в Python 3 с коротким и быстрый код? Помимо sum(), который печатает только последний элемент, я не нашел подходящего решения для своей проблемы.

ответ

7

Вы можете использовать itertools.accumulate, например:

from itertools import accumulate 

lst_old = [1, 2, 3, 4, 5] 
lst_new = list(accumulate(lst_old)) 
# [1, 3, 6, 10, 15] 
+0

Чей документ есть: https://docs.python.org/3/library/itertools.html#itertools.accumulate – Guillaume

-1

Вы можете взять сумму ломтиком списка с помощью ИМЯ_СПИСКА [начать: конец], как с начала и конца, как необязательные аргументы (недобросовестный к началу и конец списка):

lst_old = [1, 2, 3, 4, 5] 
lst_new = [] 

for i, num in enumerate(lst_old): 
    index = i+1 
    var = sum(lst_old[:index]) 
    print(var) 
    lst_new.append(var) 
+0

Ответ от Jon делает то же самое. Также вы можете передать начальное значение для перечисления вместо увеличения вручную. Однако я не голосовал :) – thiruvenkadam

1

itertools.accumulate как упомянуто Джон Клементс является лучшим способом сделать. Однако, в случае, если вы хотите явный способ сделать это, здесь идет:

lst_old = [1, 2, 3, 4, 5] 
sum = 0 
lst_new = [] 
for item in lst_old: 
    sum += item 
    lst_new.append(sum) 

Основное преимущество это, вы можете обернуть его в функцию, и если есть какой-либо трансформации или должны быть выполнены проверки, может быть добавлен.

Например, предположим, что вы хотите, чтобы остановить функция будет держать после предела, следующее поможет:

def accumulate_items(lst_old, limit=0): 
    sum = 0 
    output_list = [] 
    for item in lst_old: 
     sum += item 
     output_list.append(sum) 
     if limit and sum > limit: 
      break 
    return output_list 

Гибкость будет безгранична, если есть любое преобразование или операцию нужно делать здесь , Есть предварительное условие, которое необходимо установить? Преуспевать. У вас есть пост-состояние, которое необходимо протестировать? Преуспевать. Довольно огромный список и хотел создать генераторное решение, как и itertools.accumulate? Преуспевать. Нужно добавить проверку или обработку исключений? Преуспевать.

Однако трансформации и просто не накапливаются? Предыдущий ответ - лучший. Использование суммы со списком индексов довольно медленно, как порядок сложности небо ракет.

Смежные вопросы