Почему один код работает по-другому относительно другого?
Напишите программу, которая считывает три числа и подсчитывает сумму только положительных чисел.
Написал такой код:
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
Вы редактируете список, пока идёте по ниму в 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]))