Python - суммирование внутри списка с заданным шагом

Всем привет. Озадачила следующая ситуация. Есть некий список mList длиной 60 значений, которые мне нужно просуммировать с шагом 20. скрипт ниже, дает неверные значения

import numpy as np
res=[]
for i in range(0,len(mList),20):
    r=np.sum(mList[i:i+20])
    res.append(r)
print(res)

Но верные ответы получаются если складывать "по индексу" в таком виде

np.sum(mList[0:20])
np.sum(mList[21:40])
np.sum(mList[41:60])

Озадачило в том числе то, что в тестовом списке результаты получились верные.

import numpy as np
mList=[1,1,1,2,2,2,3,3,3]

res=[]
for i in range(0,len(mList),3):
    r=np.sum(mList[i:i+3])
    res.append(r)
print(res)

Прошу подсказать как можно получить правильные ответы через for? Фактический список будет содержать несколько тысяч значений...


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

Автор решения: arsen08
import numpy as np
mList=[1,1,1,2,2,2,3,3,3]
a=0
for i in mList:
    if i%20==0:
        a+=mList[i]
   
→ Ссылка
Автор решения: Сергей

Код автора без numpy и с тестовым списком и моими комментами ниже. Код работает правильно. Правильно он будет и с numpy работать, как ясно из ответа @CrazyElf, кто нашёл причину. Менять в самом коде ничего не надо.

res=[]
# Создлание тестового списка со значениями от 1 до 60 по порядку.
mList = [i for i in range(1,61)]
for i in range(0,len(mList),20):
    r=sum(mList[i:i+20])
    res.append(r)
# Печатает верно суммы: [210, 610, 1010]
print(res)  
→ Ссылка
Автор решения: CrazyElf

Что-то вы не совсем правильно понимаете про срезы.

np.sum(mList[0:20])
np.sum(mList[21:40])
np.sum(mList[41:60])

Этот код должен давать не правильные ответы! Потому что правый край среза не включительный. Т.е.:

mList[0:20]  --> элементы с  0 по 19 (20 элементов)
mList[21:40] --> элементы с 21 по 39 (19 элементов)
mList[41:60] --> элементы с 41 по 59 (19 элементов)

Таким образом элементы 20 и 40 у вас пропали из суммирования! А вот в коде, который с циклом, у вас всё правильно написано и всё должно правильно суммироваться. Так что вы просто не с тем сравниваете ответ.

→ Ссылка
Автор решения: leonardik

Причина неверного срабатывания кода в for оказалась простой. Из-за какого-то бага (?) Питон добавлял в список большое отрицательное число (которого в принципе не могло быть из-за логики расчета), поэтому результаты были неправильные. Неверное число удаляается в при помощи Del, и все работает нормально. А вот откуда взялся баг - опять вопрос...

→ Ссылка