Изменение списка во время итерации по нему



Предположим, что требуется удалить все нечетные числа из списка. Проблема со следующим кодом должна быть довольно очевидной:



odd = lambda x: bool(x % 2) # функция проверки числа на нечетность



numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]



for i in range(10):

  if odd(numbers[i]):

    del numbers[i] # удаление элемента из списка во время итерации по нему



# Output:

Traceback (most recent call last):

if odd(numbers[i]):

IndexError: list index out of range



Удаление элемента из списка во время его итерации – это проблема, которая хорошо известна любому опытному разработчику.



К счастью, Python включает в себя ряд элегантных парадигм программирования, которые при правильном использовании могут привести к значительному упрощению и оптимизации кода. Одна из таких парадигм – list comprehensions. Генераторы списков часто используют именно для решение подобных проблем, что и показывает реализация кода ниже:



odd = lambda x: bool(x % 2) # функция проверки числа на нечетность

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]



numbers = [n for n in numbers if not odd(n)] # генератор нового списка

print(numbers)



# Output:

[2, 4, 6, 8, 10]