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 в Python

Синтаксис 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 проверяет два условия:

  1. Делится ли y на 2 или нет.

  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:

Вложенный цикл в 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.


Видео: list, set и dictionary comprehension в Python