Курс 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. Оператор Walrus в Python 3.8
  2. Функция enumerate в Python
  3. Срез списка в Python
  4. Установка и использование Telegram API в Python
  5. Оператор match в Python
  6. Исправление ошибки NameError
  7. Создание детектора плагиата
  8. Установка и использование Python-dateutil
  9. Ключевое слово global в Python
  10. Нан-рефлексивность в Python
  11. Импорт модулей и пакетов в Python
  12. Генераторы в Python
  13. Оператор is в Python
  14. Улучшение читаемости кода в Python
  15. Проектирование Singleton с метаклассом
  16. Сумма элементов списка
  17. Создание комплексных чисел
  18. Тест скорости набора текста на Python
  19. Декораторы в Python
  20. Объединение списков в Python
  21. Изменение элемента списка
  22. Генерация QR-кодов с библиотекой qrcode
  23. Работа с итераторами через срезы
  24. Получение текущей даты в Python
  25. Подсказки при вводе данных в Python
  26. PATCH-запрос с библиотекой requests
  27. Оператор «is not» в Python
  28. Переворот строки с использованием цикла
  29. Преобразование букв в нижний регистр
  30. Метод classmethod
  31. Декораторы для регистрации функций
  32. Работа с кортежами в Python
  33. Работа с argparse
  34. Проверка файла .py на синтаксис.
  35. Использование defaultdict в Python
  36. Вычисление логарифмов в Python
  37. Генерация тестовых данных с factory_boy
  38. Объявление переменных в Python
  39. Операторы Splat и splatty-splat
  40. Закрытие файла в Python
  41. Операции с числами в Python
  42. Любовь к Python
  43. Основы работы с os
  44. Склеивание строк через метод join()
  45. Преобразование многоуровневого словаря
  46. Поиск с помощью регулярных выражений
  47. Преобразование списка в словарь через генератор
  48. Модуль sys: основы

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