Когда вы удаляете элемент из списка по определенному индексу, все элементы после указанного индекса перемещаются вперед на 1, так как в списке не может быть пропуска, поэтому после удаления 2
по индексу 1
Например, в следующей итерации x
станет 2
в индексе 2
, когда он был в индексе 3
, поэтому ваша собственная переменная index
будет указывать на неправильный элемент.
Чтобы удалить элементы из списка на месте, вы должны вместо этого считать в обратном направлении от конца списка, чтобы повторная индексация списка после удаления элемента не повлияла на точность вашего index
counter:
def keep(the_list, target):
index = len(the_list) - 1
while index >= 0:
if the_list[index] != target:
del the_list[index]
index -= 1
, чтобы:
the_list = [1, 2, 1, 2, 3, 1, 2, 3, 4]
target = 1
keep(the_list, target)
print(the_list)
выводил:
[1, 1, 1]
Но имейте в виду, что удаление элемента из списка по своей сути неэффективнопоскольку средняя сложность по времени составляет O (n) для необходимости перемещения элементов после заданного индекса, удаление нескольких элементов из списка становится квадратичным по сложности.Гораздо эффективнее использовать понимание списка для создания нового списка из старого, сохраняя только те элементы, которые равны целевому значению.Таким образом, даже несмотря на то, что приведенный выше код показывает вам, как правильно удалять элементы из списка на месте, вы не должны использовать его в любом рабочем коде.