Как последовательно посчитать сумму n элементов в массиве?
Пример: есть список change(3,5,7,1,6,8,2,4) и в нем мне надо сложить последовательные группы - "окна" - по 3 элемента от каждого элемента в списке:
3+5+7 ==> 5+7+1 ==> 7,1,6 ==> 1,6,8
и т.д.`
Как это можно реализовать?
Ответы (2 шт):
Если вы хотите реализовать сумму элементов в скользящем окне из трех элементов:
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))- цикл в количество итераций, равное длине массива arar[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) и так далее.