Изменение списка во время итерации по нему
Предположим, что требуется удалить все нечетные числа из списка. Проблема со следующим кодом должна быть довольно очевидной:
Удаление элемента из списка во время его итерации – это проблема, которая хорошо известна любому опытному разработчику.
К счастью, Python включает в себя ряд элегантных парадигм программирования, которые при правильном использовании могут привести к значительному упрощению и оптимизации кода. Одна из таких парадигм – list comprehensions. Генераторы списков часто используют именно для решение подобных проблем, что и показывает реализация кода ниже:
Предположим, что требуется удалить все нечетные числа из списка. Проблема со следующим кодом должна быть довольно очевидной:
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]