Почему один код работает по-другому относительно другого?

Напишите программу, которая считывает три числа и подсчитывает сумму только положительных чисел.

Написал такой код:

nums = [-31, -11, 5]
for i in nums:
    if i < 0:
        nums.remove(i)
print(sum(nums))

На выходе получаю -6, однако должен получать 5. Если посмотреть итоговый список, то он получается:

[-11, 5]

Не могу понять, почему остаётся -11, когда в переборе значений условием указано убирать отрицательные числа из списка? Почему это работает только для первого значения изначального списка?

Если попробовать код изменить на такой, то все получится адекватно:

a, b, c = -31, -11, 5
result = 0
if a > 0:
    result += a
if b > 0:
    result += b
if c > 0:
    result += c
if a and b and c < 0:
    print(0)
print(result)

Вывод:

5

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

Автор решения: Алексей Р

Потому, что удаляя элементы из списка в прямой последовательности, вы "перескакиваете" через следующий элемент. Чтобы получить правильный результат, можно обойти список в обратной последовательности, например:

nums = [-31, -11, 5]
for i in range(len(nums) - 1, -1, -1):
    if nums[i] < 0:
        nums.remove(nums[i])
print(sum(nums)) #5

Другое простейшее решение:

print(sum(i for i in nums if i > 0)) #5
→ Ссылка
Автор решения: Universall

Вы редактируете список, пока идёте по ниму в for, из за чего программа пропускает второе значение. Решить можно 3мя способами:

1й и самый протой - ввести переменную - итоговую сумму

nums = [-31, -11, 5]
sum = 0
for i in nums:
    if i > 0:
        sum += i
print(sum)

2й - итерироваться не по самому списку, а по его копии (в данном примере она создаётся с помощью nums[:])

nums = [-31, -11, 5]
for i in nums[:]:
    if i < 0:
        nums.remove(i)
print(sum(nums))

3й - Создать новый список и добавлять туда только положительные числа

nums = [-31, -11, 5]
positive_nums = []
for i in nums:
    if i > 0:
        positive_nums.append(i)
print(sum(positive_nums))

# Укороченная версия
# nums = [-31, -11, 5]
# print(sum([i for i in nums if i > 0]))

→ Ссылка