Почему здесь получается 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 шт):

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

Как уже сказали в комментариях:

Вы идёте по списку и параллельно его модифицируете.

Правильнее будет сделать так:

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]))
→ Ссылка
Автор решения: GrAnd

Потому, что "пилите сук на котором сидите". Вы идёте по списку и параллельно его модифицируете. Оттого некоторые элементы пропускаются (потому что они сдвинулись левее).

Если распечатывать 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)
→ Ссылка
Автор решения: CrazyElf

До кучи, в порядке прикола:

arr = [91, -63, 2, -87, -55, -23]
print(sum(filter((0).__lt__, arr)))
# 93

Фильтруем числа, оставляя такие x, что 0 < x и суммируем что получилось.

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

Ваш код может в принципе сработать если его немного подправить. Например, примерно так:

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] 
→ Ссылка