Как последовательно посчитать сумму n элементов в массиве?

Пример: есть список change(3,5,7,1,6,8,2,4) и в нем мне надо сложить последовательные группы - "окна" - по 3 элемента от каждого элемента в списке:

3+5+7 ==> 5+7+1 ==> 7,1,6 ==> 1,6,8 

и т.д.`

Как это можно реализовать?


Ответы (2 шт):

Автор решения: MaxU

Если вы хотите реализовать сумму элементов в скользящем окне из трех элементов:

data = [3,5,7,1,6,8,2,4]
res = [sum(data[i:i+3]) for i in range(len(data))]
print(res);

Вывод:
[15, 13, 14, 15, 16, 14, 6, 4]

Чтобы понять, как работают срезы для последних элементов результата:

print( [data[i:i+3] for i in range(len(data))] )

Вывод:
[[3, 5, 7], [5, 7, 1], [7, 1, 6], [1, 6, 8], [6, 8, 2], [8, 2, 4], [2, 4], [4]]
→ Ссылка
Автор решения: Максим Фисман

Что будем использовать:

Есть такая функция как sum(). Она находит сумму чисел массива (она может находить и другое, но здесь это не нужно).

Будем брать так называемый срез массива. То есть из массива берем, допусти, только 1-й, 2-й, 3-й элементы.

len() - длина массива.
range() - диапазон.


Реализация

Воспользуемся следующей командой:

summ = [sum(ar[i : i+3]) for i in range(len(ar))]

Объясняю:

  • for i in range(len(ar)) - цикл в количество итераций, равное длине массива ar
  • ar[i : i+3] - срез массива с элемента i до элемента i+3, то есть 3 элемента: ar[i], ar[i+1], ar[i+2]
  • sum(ar[i : i+3]) - сумма трех элементов среза
  • Все это обернуто в [], то есть мы в цикле проходимся, находим суммы таких блоков по 3. Получаем в итоге массив сумм sum.

Пример

ar = [1, 2, 3, 4, 5, 6, 7, 8, 9]
summ = [sum(ar[i : i+3]) for i in range(len(ar))]
print(summ);

Вывод:

[6, 9, 12, 15, 18, 21, 24, 17, 9]

P.S. Если мы будем брать предпоследний элемент, то будет происходить нахождение лишь 2 последних элементов. Последним будет нахождение суммы 1 последнего элемента, то есть сам последний элемент. Если вам нужно остановится на предпредпоследнем элементе, вы можете регулировать range(len(ar)) и изменять на range(len(ar)-2) и так далее.

→ Ссылка