Курс Python → Удаление элементов во время итерации

При удалении элемента списка во время итерации возникает интересное поведение, которое может привести к неожиданным результатам. Рассмотрим пример с двумя списками: list_2 и list_4. После удаления элемента 1 из list_2 или list_4, содержимое списков становится [2, 3, 4]. Это связано с тем, что при удалении элемента остальные сдвигаются, изменяя свои индексы. Например, элемент 2 теперь имеет индекс 0, а элемент 3 — индекс 1.

При выполнении итерации по списку Python просматривает элементы по их индексам. Если в процессе итерации был удален элемент, то следующий элемент уже имеет другой индекс. В случае с list_2 и list_4, после удаления элемента 1, элемент 2 был смещен на индекс 0, и когда итерация смотрит на индекс 1, она пропускает элемент 2, так как он теперь находится на индексе 0.

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

list_2 = [1, 2, 3, 4]
for i in list_2[:]:
    if i % 2 == 0:
        list_2.remove(i)
print(list_2)

Для более наглядного примера приведем код, который удалит все четные числа из списка list_2. Здесь мы используем срез [:], чтобы скопировать весь список итерироваться по копии, чтобы избежать проблем с изменением индексов элементов в оригинальном списке. После завершения итерации мы получаем список [1, 3], так как удалены все четные числа.

Твои коллеги будут рады, поделись в

Автор урока

Дмитрий Комаровский
Дмитрий Комаровский

Автоматизация процессов
в КраснодарБанки.ру

Другие уроки курса "Python"

  1. Использование super() в Python
  2. Склеивание строк через метод join()
  3. Генераторы данных
  4. Пропуск начальных строк с помощью dropwhile()
  5. Работа с срезами в Python
  6. Копирование файлов с shutil()
  7. Рекурсия для обращения строки
  8. Разработка Telegram-ботов
  9. Counter() — подсчет элементов
  10. Зарезервированные слова в Python
  11. Оператор Walrus: правильное использование
  12. Работа с контекст-менеджером «with»
  13. Работа с YAML в Python
  14. Удаление символа из строки
  15. Исключение NotImplementedError
  16. Модуль antigravity: генерация координат
  17. Блок else в циклах.
  18. Метод get для словарей
  19. Progress с библиотекой tqdm
  20. Функции any() и all() в Python
  21. Поиск индексов в списке
  22. Работа с прокси в Python
  23. Проверка версии Python
  24. Подчеркивание в REPL
  25. Разность множеств
  26. Лямбда-функции в Python
  27. Работа с комплексными числами
  28. Python OrderedDict и fromkeys() — работа с словарями
  29. GitHub в Telegram: подписка на уведомления
  30. Безопасные SQL-запросы в Python 3.11
  31. Работа с Requests для HTTP-запросов
  32. Вывод переменной и строки в Python
  33. Обработка ошибок в JSON данных
  34. Импорт в Python: список all
  35. Конкатенация строковых литералов
  36. Принципы SRP и OCP
  37. Логические операторы в Python
  38. Метод clear для коллекций
  39. Работа с множествами в Python
  40. Перегрузка операторов в Python
  41. Создание веб-приложения с Flask
  42. Замена переменных в Python
  43. Преобразование строки в число
  44. Нахождение максимального значения и его индекса в списке
  45. Работа с модулем Calendar

Marketello читают маркетологи из крутых компаний