Codebra
29 января 2026 в 18:33

Урок 45. List/dict/set comprehensions (включения) в Python

В этом уроке познакомимся с включениями (List/dict/set comprehensions) в Python.
📝

Внимание! На этой странице вы найдете материал урока из архивного курса по Python. Курс был написан в 2024 году и по-прежнему актуален для начинающих разработчиков.

Теоретический материал сохранен в исходном виде, а практические задания с автоматической проверкой вынесены в отдельные интенсивы и задания.

Полный список уроков доступен по тегу Архивный курс по 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», начиная с урока Урок 22. Словари в 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}

Обратите внимание на двоеточие, которое отделяет ключ от значения словаря.

Создание множество при помощи включений

В структуре ничего не меняется, кроме скобок, которые должны быть фигурными, так как мы создаем множество (про множества говорили начиная с урока Урок 27. Множества в 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 по тегу Python.