Теория урока

50. List/dict/set comprehensions (включения) в Python

В уроке 12.1. мы начали знакомиться с итераторами в Python. В этом уроке разберемся с list comprehensions (списковые включения). Иногда это понятие переводят как «генераторы списков», к сожалению, вводящий в путаницу, так как в Python есть понятие «генераторы».

List/dict/set comprehensions (списковые включения) предоставляют возможность создавать соответствующие объекты более компактно и быстро.

Включения часто встречаются в чужом коде, поэтому необходимо знать о их существовании и структуре, чтобы они не затрудняли понимание кода.

Списковые включения

Начиная с урока 6.1. было подробно рассказано про создание списков и работу с ними. Давайте создадим список при помощи list comprehensions. Так же будем использовать f-строки из урока 2.4:

Пример
items = [f'Элемент {num}' for num in range(1, 10)]
items # => ['Элемент 1', 'Элемент 2', 'Элемент 3', 'Элемент 4', 'Элемент 5', 'Элемент 6', 'Элемент 7', 'Элемент 8', 'Элемент 9']

На первый взгляд синтаксис может показаться сложным. Сейчас разберемся. Проще всего это понять по аналогии с циклом for, который был изучен в уроке 3.1. и неоднократно применялся в последующих уроках. Выведем список квадратов чисел от 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]

Перейдем к словарным включениям.

Словарные включения

Словарные включения задаются в фигурных скобках (если подзабыли словари, то вернитесь к урокам, начиная с 7.1.). Их создание аналогично списковым включениям:

Пример
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}

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

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

В структуре ничего не меняется, кроме скобок, которые должны быть фигурными, так как мы создаем множество (про множества говорили начиная с урока 8.1.):

Пример
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}

Только не стоит злоупотреблять такими вложениями. Они значительно затрудняют чтение кода. Используйте их только при необходимости.

В этом небольшом уроке мы познакомились с включениями, которые позволяют более компактно и быстро сгенерировать список, словарь или множество. На этом мы не будем останавливаться. В дальнейшем еще вернемся к включениям в контексте другой темы.

ПРОЧИТАНО
Следующий урок

Похожие уроки и записи блога

Функциональное программирование: map, filter и reduceЗнакомство с Python
Погружение в PythonЗнакомство с Python
Первое знакомство с PythonЗнакомство с Python
Структуры данных в PythonЗнакомство с Python
Написание модулей в PythonЗнакомство с Python
Обработка исключений (try/except) в PythonЗнакомство с Python
Продолжаем написание классов в PythonЗнакомство с Python
Работа с файлами в Python Знакомство с Python
Генераторы и оператор yield в PythonЗнакомство с Python
<
×
>
Впервые на сайте Codebra?

Извините за это всплывающее окно, меня они тоже раздражают.

Образовательный ресурс codebra.ru полностью посвящен программированию. Все курсы и уроки находятся на главной странице. Ради интереса можете посмотреть на содержимое курсов по Python, HTML и CSS, JavaScript, C++ и другие, размещенные на главной странице.

Если что-то не нашли, то воспользуйтесь поиском по сайту, который находится на главной странице в самом верху.

Удачи в обучении!

Закрыть окно