Убрать элементы из списка

l = [1,2,3,3]

def func(l):
    for i in l:
        if i == 3:
            l.remove(i)
    return l

func(l)
[1,2,3]

Почему функция не убирает все тройки?


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

Автор решения: Sergey Gornostaev

Потому что не стоит изменять итерируемую коллекцию. Задача идеально решается списковым включением:

[i for i in l if i != 3]
→ Ссылка
Автор решения: Victor VosMottor thanks Monica

Functional programming:

list(filter(lambda i: i != 3, your_l))
→ Ссылка
Автор решения: MarianD

Вы проходите через тот же список, из которого вы удаляете элементы.

Здесь постепенное состояния списка и актуальная позиция (как ^):

l = [1, 2, 3, 3]      # перед входом в цикл
  ^

l = [1, 2, 3, 3]      # 1-ая итерация
     ^

l = [1, 2, 3, 3]      # 2-ая итерация
        ^

l = [1, 2, 3, 3]      # 3-ая итерация — элемент на актуальной позиции удалится
           ^

l = [1, 2, 3]         # актуальная позиция за концом списка — цикл окончается
              ^
→ Ссылка