В языке программирования Python существует специальная синтаксическая конструкция, позволяющая создавать заполненные списки по определенным правилам. Создаваемые списки могут быть разными, содержание конструкции немного отличаться, поэтому такие конструкции называют генераторами списков. Их удобство заключается в более короткой записи, чем если создавать список обычным способом.
Например, надо создать список, заполненный натуральными числами до определенного числа. "Классический" способ будет выглядеть так:
a = []
for i in range(1,15):
a.append(i)
print(a)
Результат выполнения скрипта на языке Python
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Создание списка заняло у нас три строчки кода. Генератор же списка сделает это за одну:
a = [i for i in range(1,15)]
print(a)
Результат выполнения скрипта:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
В данном случае конструкция [i for i in range(1,15)] является генератором списка. Вся конструкция заключается в квадратные скобки, что как бы говорит, что будет создан список. Внутри квадратных скобок можно выделить три части:
1) что делаем с элементом (в данном случае ничего не делаем, просто добавляем в список),
2) что берем (в данном случае элемент i),
3) откуда берем (здесь из объекта range). Части отделены друг от друга ключевыми словами for и in.
Рассмотрим несколько примеров:
Пример 1.
a = [2, -2, 4, -4, 7, 5]
b = [i**2 for i in a]
print(b)
Результат выполнения скрипта:
[4, 4, 16, 16, 49, 25]
В данном случае в генераторе списка берется каждый элемент из списка a и возводится в квадрат. Таким образом,
1) что делаем - возводим элемент в квадрат,
2) что берем - элемент,
3) откуда берем - из списка a.
Пример 2.
a = {1:10, 2:20, 3:30}
b = [i*a[i] for i in a]
print(b)
Результат выполнения скрипта:
[10, 40, 90]
Здесь берется ключ из словаря, а в генерируемый список добавляется произведение ключа на его значение.
Пример 3.
a = {1:10, 2:20, 3:30}
b = [[i, a[i]] for i in a]
print(b)
Результат выполнения скрипта:
[[1, 10], [2, 20], [3, 30]]
В этом примере список b состоит из вложенных списков. Если бы в генераторе мы опустили квадратные скобки в выражении [i, a[i]], то произошла бы ошибка.
В генераторы списков в конце можно добавлять конструкцию if. Например, надо из строки извлечь все цифры:
a = "lsj94ksd231 9"
b = [int(i) for i in a if '0'<= i <='9']
print(b)
Результат выполнения скрипта:
[9, 4, 2, 3, 1, 9]
Или заполнить список числами, кратными 30 или 31:
a = [i for i in range(30, 250) if i % 30 == 0 or i % 31 == 0]
print(a)
Результат выполнения скрипта:
[30, 31, 60, 62, 90, 93, 120, 124, 150, 155, 180, 186, 210, 217, 240, 248]
Таким образом, генераторы списков позволяют создавать списки легче и быстрее. Однако заменить ими достаточно сложные конструкции не получится. Например, когда условие проверки должно включать ветку else.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.