Почему здесь получается 38, а не 93?
def positive_sum(arr):
for i in arr:
if i < 0:
arr.remove(i)
return sum(arr)
print(positive_sum([91, -63, 2, -87, -55, -23]))
Как сделать так, чтобы функция игнорировала все отрицательные числа и суммировала положительные? Почему в более простых примерах работает и выдаёт правильную сумму, а где больше значений неправильную?
Ответы (4 шт):
Как уже сказали в комментариях:
Вы идёте по списку и параллельно его модифицируете.
Правильнее будет сделать так:
def positive_sum(arr):
my_sum = 0
for i in arr:
if i > 0:
my_sum += i
return my_sum
print(positive_sum([91, -63, 2, -87, -55, -23]))
Потому, что "пилите сук на котором сидите". Вы идёте по списку и параллельно его модифицируете. Оттого некоторые элементы пропускаются (потому что они сдвинулись левее).
Если распечатывать print(i, arr) список каждый раз, когда вы из него удаляете элемент, то легко это заметить.
-63 [91, 2, -87, -55, -23]
-87 [91, 2, -55, -23]
-23 [91, 2, -55]
Обнаружили -63, удалили, на его место встала 2. Но ей повезло, что она положительная, т.к. на следующей итерации проверяется уже -87. Удаляется -87, на её место встаёт -55. Но на следующей итерации следующий элемент уже -23, а -55 "пропустили".
И вообще, проще (и быстрее) фильтровать значения по критерию при проходе, чем модифицировать исходный список.
def positive_sum(arr):
return sum(item for item in arr if item >= 0)
До кучи, в порядке прикола:
arr = [91, -63, 2, -87, -55, -23]
print(sum(filter((0).__lt__, arr)))
# 93
Фильтруем числа, оставляя такие x, что 0 < x и суммируем что получилось.
Ваш код может в принципе сработать если его немного подправить. Например, примерно так:
def positive_sum(arr):
for i in range(len(arr)-1,-1,-1):
if arr[i] < 0:
arr.remove(arr[i])
return sum(arr)
Это в случае если нужно не просто найти сумму положительных, но и заодно зачистить в исходном списке отрицательные числа. Так как в результате работы функции получится это:
nums = [91, -63, 2, -87, -55, -23]
print(positive_sum(nums))
'''
93
'''
print(f'{nums = }')
'''
nums = [91, 2]