Удаление элементов из списка через цикл

Только недавно начал изучать питон и вот столкнулся с первыми проблемами

Вот само задание

using loop remove all x occurences in the above list

hint -> think what condition you need to specify for loop break

А вот как я попытался его решить

my_list = [1, 'x', 2, 'x', 3, 'x', 'x']


for i in my_list:
  if i == 'x':
    my_list.remove(i)

print(my_list)

Не могу понять, почему после компиляции в ответе остаётся 'x'

[1, 2, 3, 'x']

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

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

Удаление меняет количество элементов и это имеет значение, если перебор идет по порядку

В вашем случае решением будет перебор с конца:

my_list = [1, 'x', 2, 'x', 3, 'x', 'x']
for i in reversed(my_list):
    if i == 'x':
        my_list.remove(i)
print(my_list)
# [1, 2, 3]

Еще можно создать новый список, исключая элемент:

my_list = [x for x in my_list if x != 'x']
→ Ссылка
Автор решения: Сергей

Вы модифицируете последовательность, с которой работает итератор. В результате, он прекращает нормально работать. Вам нужно или идти с конца в таком случае или создать копию списка, как рекомендует официальное руководство Python при необходимости модификации итерируемых последовательностей: https://docs.python.org/2/tutorial/controlflow.html#for-statements

С копией:

my_list = [1, 'x', 2, 'x', 3, 'x', 'x']


for i in my_list[:]:
  if i == 'x':
    my_list.remove(i)

print(my_list)

С проходом с конца:

my_list = [1, 'x', 2, 'x', 3, 'x', 'x']


for i in range (len(my_list) -1, -1, -1):
    if my_list[i] == 'x':
        del my_list[i]

print(my_list)

Кстати, следующую ошибку рекомендую иссследовать самому с помощью отладчика. Я сам использую PyCharm. Вот здесь очень простая и короткая рекомендация по отладке в моём ответе на другой вопрос: Ошибка в коде генерации пароля. Просьба помочь найти причину, дать пояснение

→ Ссылка