Удаление элементов из списка через цикл
Только недавно начал изучать питон и вот столкнулся с первыми проблемами
Вот само задание
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 шт):
Удаление меняет количество элементов и это имеет значение, если перебор идет по порядку
В вашем случае решением будет перебор с конца:
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. Вот здесь очень простая и короткая рекомендация по отладке в моём ответе на другой вопрос: Ошибка в коде генерации пароля. Просьба помочь найти причину, дать пояснение