Инструмент list comprehensions

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

List comprehensions

Иногда это переводят как «генераторы списков», но это не совсем верный термин. Я его не стану переводить, а покажу работу этого инструмента на конкретных примерах.

Представьте, что нам нужно создать список, состоящий из квадратов чисел, определенных от 0 до N-1. Используя текущие знания, это можно было бы реализовать так:

A=[]
N=10
for x in range(N):
     A.append(x**2)
 
print(A)

А теперь этот же алгоритм с использованием list comprehensions:

N=10
A = [x**2 for x in range(N)]
print(A)

Смотрите, все создание списка записано в одну строчку. И, кроме того, этот вариант будет работать быстрее предыдущей программы, т.к. Python оптимизирует работу таких конструкций.

Давайте теперь разберемся в этом синтаксисе. Вначале мы указываем, что будем делать с переменной x. Казалось бы, переменная нигде не задана, а мы уже говорим что с ней делать. Да, это так, это такой элемент синтаксиса list comprehensions. Далее, через пробел мы записываем цикл for и уже там указываем эту переменную x и говорим как она будет меняться. То есть, эта временная переменная x существует только внутри списка и пропадает после его создания.

Теперь немного усложним этот пример, и предположим, что нам нужно создать список только из четных чисел. Опять же, обычным способом мы могли бы это сделать так:

A=[]
N=10
for x in range(N):
     if x%2 == 0:
          A.append(x**2)
 
print(A)

А через list comprehensions это записывается следующим образом:

N=10
A = [x**2 for x in range(N) if x%2 == 0]
print(A)

То есть, после цикла мы можем записать любое условие и если оно становится истинным, то формируется новый элемент списка. Видите, как это просто можно реализовать.

Разумеется, вместо возведения в степень мы можем прописывать любые функциональные выражения, или записать просто x:

A = [x for x in range(N) if x%2 == 0]

Тогда получим последовательность четных чисел. Или же формулу вычисления значений линейной функции:

A = [0.5*x+1 for x in range(N)]

И так далее, здесь может быть любое выражение. Также можно оперировать не только числами, но и другими типами данных, например, строками:

cities = ["Москва", "Тверь", "Рязань", "Ярославль", "Владимир"]
A = [city for city in cities if len(city) < 7]
print(A)

Здесь мы формируем список из названий городов, длины которых меньше семи символов. По этому принципу можно строить самые разные алгоритмы формирования списков.

Видео по теме