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 шт):
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)
Что-то вы не совсем правильно понимаете про срезы.
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 у вас пропали из суммирования! А вот в коде, который с циклом, у вас всё правильно написано и всё должно правильно суммироваться. Так что вы просто не с тем сравниваете ответ.
Причина неверного срабатывания кода в for оказалась простой. Из-за какого-то бага (?) Питон добавлял в список большое отрицательное число (которого в принципе не могло быть из-за логики расчета), поэтому результаты были неправильные. Неверное число удаляается в при помощи Del, и все работает нормально. А вот откуда взялся баг - опять вопрос...