Поведение удаления элементов из списка во время его обхода

Указанный результат верен: [2, 5, 11, 111, 7, 27]. Изменение длины списка во время for сдвигает элементы под продвигающимся итератором, поэтому 2 не проверяется после удаления 1.

Короткий ответ

Что ответить на собеседовании

Указанный результат верен: [2, 5, 11, 111, 7, 27]. Изменение длины списка во время for сдвигает элементы под продвигающимся итератором, поэтому 2 не проверяется после удаления 1.

Подробный разбор

Ответ с пояснениями

Условие

Опишите, как работает приведённый код, который пытается удалить из списка все значения меньше 5, одновременно проходя по этому же списку.

numbers = [1, 2, 5, 11, 3, 111, 7, 27]

for i in numbers:
    if i < 5:
        numbers.remove(i)

print(numbers)
# Результат: [2, 5, 11, 111, 7, 27]

Ответ

Указанный результат верен: [2, 5, 11, 111, 7, 27]. Изменение длины списка во время for сдвигает элементы под продвигающимся итератором, поэтому 2 не проверяется после удаления 1.

Цикл удалит 1 и 3, но не все значения меньше 5. Это не случайная ошибка remove(), а следствие совместного изменения контейнера и его обхода. Для получения очищенной последовательности подходит списковое включение с условием >= 5. Другой вариант — удаление по индексам справа налево, чтобы сдвиги не затрагивали ещё не обработанную часть. Обычный проход по копии тоже возможен, но многократный remove может быть квадратичным.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее