0 знаков
45. List/dict/set comprehensions (включения) в Python
Кратко- Списковые включения позволяют создавать объекты более компактно и быстро.
- Включения часто встречаются в чужом коде и важно знать их структуру для понимания кода.
- Общая структура списковых включений содержит операцию и элемент списка.
- Включения могут быть использованы для фильтрации данных и управления операцией.
- Вложенные включения могут затруднять чтение кода и их следует использовать только при необходимости.
В предыдущем уроке мы начали знакомиться с итераторами в Python. В этом уроке разберемся с list comprehensions (списковые включения). Иногда это понятие переводят как «генераторы списков», к сожалению, вводящий в путаницу, так как в Python есть понятие «генераторы».
List/dict/set comprehensions (списковые включения) предоставляют возможность создавать соответствующие объекты более компактно и быстро.
Включения часто встречаются в чужом коде, поэтому необходимо знать о их существовании и структуре, чтобы они не затрудняли понимание кода.
Списковые включения
В разделе «Структуры данных в Python» было подробно рассказано про создание списков и работу с ними. Давайте создадим список с помощью list comprehensions. Так же будем использовать f-строки из урока про форматирование строк:
items = [f'Элемент {num}' for num in range(1, 10)]
items # => ['Элемент 1', 'Элемент 2', 'Элемент 3', 'Элемент 4', 'Элемент 5', 'Элемент 6', 'Элемент 7', 'Элемент 8', 'Элемент 9']
На первый взгляд синтаксис может показаться сложным. Сейчас разберемся. Проще всего это понять по аналогии с циклом for
, который был изучен ранее и неоднократно применялся в последующих уроках. Выведем список квадратов чисел от 1
до 9
при помощи цикла for
.
squares = list()
for i in range(1, 10):
squares.append(i*i)
squares # => [1, 4, 9, 16, 25, 36, 49, 64, 81]
Теперь решим эту же задачу при помощи списковых включений:
squares = [i*i for i in range(1, 10)]
squares # => [1, 4, 9, 16, 25, 36, 49, 64, 81]
На первый взгляд может показаться, что мы только усложняем код, если вы знакомитесь со списковыми включениями первый раз. Приведем общую структуру списковых включений:
НОВЫЙ_СПИСОК = [ОПЕРАЦИЯ for ЭЛЕМЕНТ_СПИСКА in СПИСОК]
Под «ОПЕРАЦИЕЙ»
понимается некое действие, которое будет применяться к «ЭЛЕМЕНТУ СПИСКА»
. Под «ЭЛЕМЕНТОМ СПИСКА»
подразумевается отдельный элемент из «СПИСКА»
. Результатом является «НОВЫЙ СПИСОК»
.
Выше представлена не полная структура списковых включений. Иногда, помимо генерации списка, необходимо отфильтровать некоторые данные. Для этих целей можно добавить условие в конце:
НОВЫЙ_СПИСОК = [ОПЕРАЦИЯ for ЭЛЕМЕНТ_СПИСКА in СПИСОК if УСЛОВИЕ]
Например, найдем квадраты чисел, которые кратны трем:
squares = [i*i for i in range(1, 10) if i % 3 == 0]
squares # => [9, 36, 81]
Так же условие может быть добавлено перед циклом for
. В этом случае мы будем управлять выполняемой операцией. Например, создадим все тот же список квадратов, но только будем возводить в квадрат четные числа, а остальные добавлять в исходном состоянии.
squares = [i*i if (i % 2 == 0) else i for i in range(1, 10)]
squares # => [1, 4, 3, 16, 5, 36, 7, 64, 9]
Перейдем к словарным включениям.
Словарные включения
Словарные включения задаются в фигурных скобках (если подзабыли словари, то вернитесь к урокам раздела «Структуры данных в Python», начиная с урока Словари в Python). Их создание аналогично списковым включениям:
squares = {i: i*i for i in range(1, 10)}
squares # => {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Обратите внимание на двоеточие, которое отделяет ключ от значения словаря.
Создание множество при помощи включений
В структуре ничего не меняется, кроме скобок, которые должны быть фигурными, так как мы создаем множество (про множества говорили начиная с урока Множества в Python):
squares = {i*i for i in [1, 1, 1, 2, 2, 3, 3, 5]}
squares # => {1, 4, 9, 25}
Вложенные включения
Включения могут быть вложенными. Например, мы можем возвести все элементы матрицы в квадрат:
matrix = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
squares = [[item ** 2 for item in row] for row in matrix]
squares # => [[1, 4, 9], [1, 4, 9], [1, 4, 9]]
Или, например, сгенерировать список уникальных элементов матрицы:
matrix = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
squares = {item for row in matrix for item in row}
squares # => {1, 2, 3}
Только не стоит злоупотреблять такими вложениями. Они значительно затрудняют чтение кода. Используйте их только при необходимости.
В этом небольшом уроке мы познакомились с включениями, которые позволяют более компактно и быстро сгенерировать список, словарь или множество. На этом мы не будем останавливаться. В дальнейшем еще вернемся к включениям в контексте другой темы. В следующем разделе начнем изучение функций в Python, но для начала подведем итоги этого раздела.
Тест
Похожие уроки Codebra
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ