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 принимает новое значение с каждой последующей итерацией, то в список будет заноситься последовательность вида:


$x_{0}+chr(x_{0}), x_{1}+chr(x_{1}),...x_{25}+chr(x_{25})$


А значит, каждый элемент в словаре равен:


$dict(x_{n})=x_{n}+chr(x_{n})$


где $n$— итерация, $x_{n}$ — ключ, $chr(x_{n})$ — значение.


Просто дайте мне результат!


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

Комментарии (0)