Введение
Списковые включения предлагают лаконичный способ создания списков на основе существующих списков. При использовании списковых включений списки могут быть построены, используя любой итерируемый объект, включая строки и кортежи.
Синтаксически списковые включения состоят из итерируемого объекта, содержащего выражение, за которым следует ключевое слово for
. За этим может следовать дополнительное использование ключевых слов for
или if
, поэтому знакомство с циклами for и условными операторами поможет вам лучше понять списковые включения.
Списковые включения предоставляют альтернативный синтаксис для создания списков и других последовательных типов данных. В то время как другие методы итерации, такие как циклы for
, также могут использоваться для создания списков, списковые включения могут быть предпочтительны, потому что они могут ограничить количество строк, используемых в вашей программе.
Предпосылки
У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас нет настроенной среды программирования, вы можете обратиться к руководствам по установке и настройке для локальной среды программирования или для среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.)
Списковые включения
В Python списковые включения конструируются следующим образом:
Информация: Чтобы следовать за примерами кода в этом учебнике, откройте интерактивную оболочку Python на своей локальной системе, запустив команду python3
. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>
.
A list, or other iterable, is assigned to a variable. Additional variables that stand for items within the iterable are constructed around a for
clause. The in
keyword is used as it is in for
loops, to iterate over the iterable
.
Давайте рассмотрим пример создания списка на основе строки:
Здесь новый список присваивается переменной shark_letters
, а letter
используется для представления элементов, содержащихся в итерируемой строке 'shark'
.
Чтобы подтвердить, как выглядит новый список shark_letters
, мы вызываем его с помощью print()
и получаем следующий вывод:
Output['s', 'h', 'a', 'r', 'k']
Список, созданный с помощью генератора списка, состоит из элементов строки 'shark'
, то есть одна строка для каждой буквы.
Генераторы списка могут быть переписаны как циклы for
, хотя не каждый цикл for
может быть переписан как генератор списка.
Используя наш генератор списка, создавший список shark_letters
выше, давайте перепишем его как цикл for
. Это может помочь нам лучше понять, как работает генератор списка.
При создании списка с помощью цикла for
переменная, назначенная списку, должна быть инициализирована пустым списком, как это сделано в первой строке нашего блока кода. Затем цикл for
выполняет итерацию по элементам, используя переменную letter
в итерируемой строке 'shark'
. Внутри цикла for
каждый элемент в строке добавляется в список с помощью метода list.append(x)
.
Переписав включение списка как цикл for
, мы получаем тот же вывод:
Output['s', 'h', 'a', 'r', 'k']
Включения списков могут быть переписаны как циклы for
, и некоторые циклы for
могут быть переписаны как включения списков, чтобы сделать код более лаконичным.
Использование условий с включениями списков
Включения списков могут использовать условные операторы для изменения существующих списков или других последовательных типов данных при создании новых списков.
Давайте рассмотрим пример использования оператора if
в включении списка:
Списковое включение использует кортеж fish_tuple
в качестве основы для нового списка, называемого fish_list
. Используются ключевые слова for
и in
, так же как и в секции выше, а теперь добавляется оператор if
. Утверждение if
говорит о том, что нужно добавлять только те элементы, которые не эквивалентны строке 'octopus'
, поэтому новый список принимает только те элементы кортежа, которые не соответствуют 'octopus'
.
Когда мы запустим это, мы заметим, что fish_list
содержит те же строковые элементы, что и fish_tuple
, за исключением того, что строка 'octopus'
была исключена:
Output['blowfish', 'clownfish', 'catfish']
Таким образом, наш новый список содержит каждый элемент исходного кортежа, за исключением строки, которая исключается условным оператором.
Мы создадим еще один пример, использующий математические операторы, целые числа и тип последовательности range()
.
Создаваемый список, number_list
, будет заполнен квадратными значениями каждого элемента в диапазоне от 0 до 9 если значение элемента делится на 2. Вывод выглядит следующим образом:
Output[0, 4, 16, 36, 64]
Для более детального понимания того, что делает генератор списка, давайте подумаем о том, что будет напечатано, если бы мы вызывали только x for x in range(10)
. Наша небольшая программа и вывод будут выглядеть следующим образом:
Output[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Теперь давайте добавим условное выражение:
Output[0, 2, 4, 6, 8]
Оператор if
ограничил элементы в конечном списке, чтобы в него входили только те элементы, которые делятся на 2, исключая все нечетные числа.
Наконец, мы можем добавить оператор для возведения каждого x
в квадрат:
Таким образом, каждое число в предыдущем списке [0, 2, 4, 6, 8]
теперь возводится в квадрат:
Output[0, 4, 16, 36, 64]
Вы также можете воспроизвести вложенные if
выражения с использованием генератора списка:
Здесь генератор списка сначала проверит, делится ли число x
на 3, а затем проверит, делится ли x
на 5. Если x
удовлетворяет обоим условиям, оно будет напечатано, и вывод будет следующим:
Output[0, 15, 30, 45, 60, 75, 90]
Условные выражения if
могут использоваться для управления тем, какие элементы из существующей последовательности включаются в создание нового списка.
Вложенные циклы в генераторе списка
Вложенные циклы могут использоваться для выполнения нескольких итераций в наших программах.
На этот раз мы рассмотрим существующую конструкцию вложенного цикла for
и продвинемся к списковому включению.
Наш код будет создавать новый список, который будет итерироваться по 2 спискам и выполнять математические операции на их основе. Вот наш блок кода вложенного цикла for
:
При запуске этого кода мы получаем следующий вывод:
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]
Этот код умножает элементы первого списка на элементы второго списка на каждой итерации.
Чтобы преобразовать это в список включения, мы сожмем каждую строку кода в одну строку, начиная с операции x * y
. Затем последует внешний цикл for
, а затем внутренний цикл for
. Мы добавим оператор print()
под нашим списковым включением, чтобы подтвердить, что новый список соответствует списку, созданному с помощью нашего блока вложенного цикла for
выше:
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]
Наше списковое включение берет вложенные циклы for
и сжимает их в одну строку кода, при этом все равно создавая тот же самый список для присвоения переменной my_list
.
Списковые включения предоставляют нам лаконичный способ создания списков, позволяя нам упростить несколько строк кода в одну строку. Однако стоит помнить, что читаемость нашего кода всегда должна иметь преимущество, поэтому когда строка списка включений становится слишком длинной или неуклюжей, может быть лучше разбить ее на циклы.
Заключение
Списковые включения позволяют нам преобразовывать один список или другую последовательность в новый список. Они предоставляют краткий синтаксис для выполнения этой задачи, ограничивая количество строк кода.
Списковые включения следуют математической форме нотации построителя множества или включения множества, поэтому они могут быть особенно интуитивны для программистов с математическим образованием.
Хотя списковые включения могут делать наш код более лаконичным, важно обеспечить максимальную читаемость нашего финального кода, поэтому очень длинные однострочные строки кода следует избегать, чтобы наш код был удобочитаемым.
Source:
https://www.digitalocean.com/community/tutorials/understanding-list-comprehensions-in-python-3