Cписковое включение — это особенность Python, которая позволяет упростить объявление и заполнение стркутур данных. Кроме того, списковое включение выигрывает в скорости у классического заполнения циклом.
Цикл for и метод append в заполнении списка
Для того, чтобы понять эффективность спискового включения, необходимо сравнить его с обычным способом заполнения списка. Начнём с объявления:
my_list_1 = list()
Здесь мы объявляем переменную my_list_1
как список.
Обычно списки заполняют данными — сделаем это циклом for
и встроенной функцией range()
:
for i in range(10):
Функция range()
возвращает последовательность значений, в данном случае она присваивает переменной i
значения от 0 до 9 поочерёдно. Чтобы занести эти значения в список нам понадобится стандартный метод append
:
my_list_1.append(i)
Метод append
работает со списками — с каждой новой итерацией цикла for
он вставляет значение переменной i
в конец списка. Таким образом список my_list_1
дополняется новыми значениями. Смотрите сами:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Вы получите такой вывод, если исполните следующий код:
my_list_1 = list()
for i in range(10):
my_list_1.append(i)
print(my_list_1)
Освойте списковое включение
Главное преимущество спискового включения — это его скорость. Если вам нужно заполнить список всего десятью значениями одинокого типа, то в предыдущем примере нет никаких проблем. Они начинаются, когда в список заносятся сотни и тысячи данных разного типа. Тогда метод append
подводит нас. Ведь после каждой итерации циклу нужно выполнять инструкцию в теле, и добавлять значения в список.
Вот, почему существует списковое включение:
my_list_2 = [i for i in range(10)]
Да, оно реализуется всего одной строкой и выглядит понятней!
Cписок объявляется оператором []
, а внутри указываются все дальнейшие инструкции. Так, первая переменная i
— является последним выражением в инструкции, именно она будет записываться в список после того, как примет значение от цикла for
.
А главное, результат остаётся прежним:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Цикл for в заполнении словаря
Как и список, словарь — это структрура данных. В отличие от списка, элемент в словаре состоит из пары «ключ: значение». Если в списке для доступа к элементам используются индексы, то в словаре роль индексов играют ключи. Представьте телефонную книгу, в которой записаны фамилии и нужный вам номер. Чтобы получить номер (значение), вы ищите его по фамилии (ключу). Таким же способом используется словарь.
Для примера можно посчитать количество букв латинского алфавита, и занести в словарь каждую букву с её порядковым номером.
Для начала явно объявим словарь:
my_dict_1 = dict()
Заполнять будем циклом:
for x in range(26):
26 — количество букв латинского алфавита. Осталось сохранить их в словарь:
my_dict_1[x] = chr(x+65)
Заметьте, что my_dict_1[x]
— это не объявление списка, а обращение к элементу словаря через переменную x
. Далее следует встроенный метод сhr()
, который возвращает символ из таблицы ASCII по его числовому представлению. Cогласно таблице, число 65 является символом «A», 66 — «B», и так далее.
Строку целиком следует понимать, как «в элемент x
списка my_dict_1
занести значение на выходе метода chr()
. Поскольку в параметрах функции chr()
используется арифметическое выражение x+65
, а в цикле переменная x
принимает новое значение с каждой последующей итерацией, то в список будет заноситься последовательность вида:
А значит, каждый элемент в словаре равен:
где — итерация, — ключ, — значение.
Просто дайте мне результат!
my_dict_1 = dict()
for x in range(26):
my_dict_1[x] = chr(x+65)
print(my_dict_1)
Вы увидите словарь, заключенный в фигурные скобки. В нём через запятую перечислены элементы, состоящие из пары «ключ: значение».
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J', 10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O', 15: 'P', 16: 'Q', 17: 'R', 18: 'S', 19: 'T', 20: 'U', 21: 'V', 22: 'W', 23: 'X', 24: 'Y', 25: 'Z'}
Освойте словарное включение
По аналогии со списками нам доступно словарное включение:
my_dict_2 = {x:chr(x+65) for x in range(26)}
Здесь словарь объявляется оператором {}
, а внутри происходит его наполнение. Вначале указывается пара «ключ: значение», а затем цикл for
.
Распаковка словаря
Термин «распаковка» применяется относительно структур данных. Он означает выбор данных в структуре и последующее представления в виде отдельных типов.
Распаковка совершается циклом for
, который итерирует по непустой структуре данных.
Распакуем элементы предыдущего словаря:
for k in my_dict_1:
print(f'{k}: {my_dict_1[k]}')
В теле цикла метод format()
, представленный в виде псевдонима f``, форматирует значения переменной
k, которая, в свою очередь, представляет элементы словаря
my_dict_1, поэтому
print()` выводит не словарь целиком, как в предыдущем примере, а каждый элемент в виде отдельного типа:
0: A
1: B
2: C
3: D
4: E
5: F
6: G
7: H
8: I
9: J
10: K
11: L
12: M
13: N
14: O
15: P
16: Q
17: R
18: S
19: T
20: U
21: V
22: W
23: X
24: Y
25: Z
Распаковка списка кортежей
Кортеж — очередная структура данных. В отличие от списка, который можно изменять, данные в кортеже остаются неизменными. Используйте кортеж для хранения чувствительных данных, например, реквизитов.
Для закрепления вашего понимания принципа распаковки, воспользуемся списком кортежей.
Объявим список кортежей:
list_of_tuples = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
Обратите внимание, что кортежи в списке разделены запятыми, и являются элементами списка.
Цикл for
для распаковки:
for x, y in list_of_tuples:
print(x, y)
Переменные x
и y
принимают значения каждого элемента кортежей в списке. Каждая новая итерация выводит значения одного кортежа:
1 2
3 4
5 6
7 8
9 10