Непонятна логика

i = 0
save = []
while i <= 9:
    arr = int(input(("Введите число:")))
    save += [arr]
    i += 1
def positive_sum(arr):
    for i in arr:
        if i < 0:
            arr.remove(i)
    print(arr)
positive_sum(save)

Есть значит такой код, который должен отрицательное число со списка удалить, но какие-то он удаляет, а некоторые отрицательные оставляет почему так? Вот к примеру что вывелось в конце [213, 1, 23, 4, 21, -2, -4] Хотя -2 и -4 не должно быть.


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

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

потому что НИКОГДА НЕ УДАЛЯЙТЕ ЭЛЕМЕНТЫ ДВИГАЯСЬ ПО СПИСКУ!!!

ошибка многих - вы идете по списку от его начало до конца, но удаляя элемент вы сокращаете его размер и как бы сдвигаетесь еще вперед, в итоге ваша нумерация слетает и возникает ошибка в логике

режьте с помощью filter

save = list(filter(lambda elem: elem >= 0, save))

т.е. вы собираете новый список из элементов старого, которые не меньше 0

ну или можно собрать новый список из старого через for if

save = [elem for elem in save if elem >= 0]

при простых условиях это выглядит короче, чем через filter

P.S.

кстати зачем такой изврат?

i = 0
while i <= 9:
    arr = int(input(("Введите число:")))
    save += [arr]
    i += 1

можно же

save = [int(input(("Введите число:"))) for i in range(10)]

ну или если не нравится в 1 строку, то

for i in range(10):
    save += [int(input(("Введите число:")))]

а если числа передать через пробел то вообще можно так:

save = list(map(int, input().split()))[:10]
→ Ссылка