Python: list comprehension
List comprehension — это краткий способ создать новый список на основе значений существующего списка.
Предположим, у нас есть список чисел, и мы хотим создать новый список, содержащий удвоенные значения каждого элемента списка.
numbers = [1, 2, 3, 4]
# list comprehension для создания нового списка
doubled_numbers = [num * 2 for num in numbers]
print(doubled_numbers)
Вывод
[2, 4, 6, 8]
Вот как работает list comprehension:
Синтаксис list comprehension
[expression for item in list if condition == True]
Здесь для каждого item в list выполняется expression, если condition равно True.
Примечание
Оператор if в list comprehension необязателен.
Цикл for vs list comprehension
List comprehension делает код чище и более кратким, чем цикл for.
Напишем программу для вывода квадрата каждого элемента списка, используя и цикл for, и list comprehension.
Цикл for
numbers = [1, 2, 3, 4, 5]
square_numbers = []
# цикл for для возведения каждого элемента в квадрат
for num in numbers:
square_numbers.append(num * num)
print(square_numbers)
# Output: [1, 4, 9, 16, 25]
List comprehension
numbers = [1, 2, 3, 4, 5]
# создаём новый список с помощью list comprehension
square_numbers = [num * num for num in numbers]
print(square_numbers)
# Output: [1, 4, 9, 16, 25]
Понять list comprehension намного проще, если вы знаете цикл for в Python.
Условные операторы в list comprehension
List comprehension может использовать условные операторы, такие как if…else, для фильтрации существующих списков.
Рассмотрим пример оператора if с list comprehension.
# фильтруем чётные числа из списка
even_numbers = [num for num in range(1, 10) if num % 2 == 0 ]
print(even_numbers)
# Output: [2, 4, 6, 8]
Здесь list comprehension проверяет, является ли число из range(1, 10) чётным или нечётным. Если чётное — добавляет число в список.
Примечание
Функция range() генерирует последовательность чисел.
if…else с list comprehension
Воспользуемся if...else с list comprehension, чтобы найти чётные и нечётные числа.
numbers = [1, 2, 3, 4, 5, 6]
# находим чётные и нечётные числа
even_odd_list = ["Even" if i % 2 == 0 else "Odd" for i in numbers]
print(even_odd_list)
Вывод
['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even']
Здесь, если элемент в списке numbers делится на 2, добавляется Even в список even_odd_list. В противном случае добавляется Odd.
Вложенный if в list comprehension
Воспользуемся вложенным if с list comprehension, чтобы найти чётные числа, делящиеся на 5.
# находим чётные числа, делящиеся на 5
num_list = [y for y in range(100) if y % 2 == 0 if y % 5 == 0]
print(num_list)
Вывод
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Здесь list comprehension проверяет два условия:
Делится ли
yна 2 или нет.Если да, то делится ли
yна 5 или нет.
Если y удовлетворяет обоим условиям, число добавляется в num_list.
Пример: list comprehension со строкой
Мы также можем использовать list comprehension с итерируемыми объектами, отличными от списков.
word = "Python"
vowels = "aeiou"
# находим гласные в строке "Python"
result = [char for char in word if char in vowels]
print(result)
# Output: ['o']
Здесь мы использовали list comprehension, чтобы найти гласные в строке 'Python'.
Подробнее о list comprehension в Python
Вложенный list comprehension
Мы также можем использовать вложенные циклы в list comprehension. Напишем код для вычисления таблицы умножения.
multiplication = [[i * j for j in range(1, 6)] for i in range(2, 5)]
print(multiplication)
Вывод
[[2, 4, 6, 8, 10], [3, 6, 9, 12, 15], [4, 8, 12, 16, 20]]
Вот как работает вложенный list comprehension:
Посмотрим эквивалентный код с использованием вложенного цикла for.
Эквивалентный вложенный цикл for
multiplication = []
for i in range(2, 5):
row = []
for j in range(1, 6):
row.append(i * j)
multiplication.append(row)
print(multiplication)
Здесь вложенный цикл for генерирует тот же вывод, что и вложенный list comprehension. Видно, что код с list comprehension намного чище и короче.
List comprehensions vs Lambda-функции
Наряду с list comprehension мы также используем lambda-функции для работы со списками.
В то время как list comprehension обычно используется для фильтрации списка на основе некоторых условий, lambda-функции обычно используются с такими функциями, как map() и filter().
Они используются для сложных операций или когда требуется анонимная функция.
Рассмотрим пример.
numbers = [5, 6, 7, 8, 9]
# создаём новый список с помощью lambda-функции
square_numbers = list(map(lambda num : num**2 , numbers))
print(square_numbers)
Вывод
[25, 36, 49, 64, 81]
Тот же результат можно получить с помощью list comprehension:
# создаём новый список с помощью list comprehension
square_numbers = [num ** 2 for num in numbers]
Сравнивая два варианта кода, можно увидеть, что list comprehension проще и понятнее для чтения.
Поэтому, если нам не нужно выполнять сложные операции, мы можем придерживаться list comprehension.