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

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

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

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

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

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

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

Условие

Опишите, что происходит в данном фрагменте кода, предскажите его вывод и объясните, какую задачу хотел решить автор. Пример: удаление элементов из списка в процессе итерации.

values = [1, 2, 5, 11, 3, 111, 7, 27]
for x in values:
    if x < 5:
        values.remove(x)
print(values)

Ответ

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

Итератор списка продвигает индекс, но удаление текущего элемента сдвигает оставшиеся элементы влево. После удаления 1 число 2 оказывается на уже пройденной позиции. Позже удаляется 3, а 111 также пропускается, хотя это не влияет на требуемую фильтрацию.

Безопасный вариант:

values = [x for x in values if x >= 5]

Если необходимо сохранить идентичность списка для других ссылок:

values[:] = [x for x in values if x >= 5]

Оба варианта дают [5, 11, 111, 7, 27]. Фильтрация выполняется за O(n), тогда как многократный remove может привести к O(n²).

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

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

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

Подробнее