Простой Python. Современный стиль программирования (Любанович) - страница 59

>[выражение for элемент in итерабельный объект if условие]

Создадим новое включение, которое создает список, состоящий только из четных чисел, расположенных в диапазоне от 1 до 5 (помните, что выражение number % 2 имеет значение True для четных чисел и False для нечетных):

>>>> a_list = [number for number in range(1,6) if number % 2 == 1]

>>>> a_list

>[1, 3, 5]

Теперь включение выглядит чуть более компактно, чем его традиционный аналог:

>>>> a_list = []

>>>> for number in range(1,6):

>…·····if number % 2 == 1:

>…·········a_list.append(number)

>…

>>>>··a_list

>[1, 3, 5]

Наконец, точно так же, как и в случае вложенных циклов, можно написать более чем один набор операторов for… в соответствующем выделении. Чтобы продемонстрировать это, сначала создадим старый добрый вложенный цикл и выведем на экран результат:

>>>> rows = range(1,4)

>>>> cols = range(1,3)

>>>> for row in rows:

>…·····for col in cols:

>…·········print(row, col)

>…

>1 1

>1 2

>2 1

>2 2

>3 1

>3 2

Теперь воспользуемся включением и присвоим его переменной cells, создавая тем самым список кортежей (row, col):

>>>> rows = range(1,4)

>>>> cols = range(1,3)

>>>> cells = [(row, col) for row in rows for col in cols]

>>>> for cell in cells:

>…·····print(cell)

>…

>(1, 1)

>(1, 2)

>(2, 1)

>(2, 2)

>(3, 1)

>(3, 2)

Кстати, вы можете воспользоваться распаковкой кортежа, чтобы выдернуть значения row и col из каждого кортежа по мере итерирования по списку cells:

>>>> for row, col in cells:

>…·····print(row, col)

>…

>1 1

>1 2

>2 1

>2 2

>3 1

>3 2

Фрагменты for row… и for col… во включении также могут иметь свои проверки if.

Включение словаря

Для словарей также можно создать включение. Простейшая его форма выглядит привычно:

>{ выражение_ключа: выражение_значения for выражение in итерабельный объект }

Как и в случае с включениями списка, выделения словарей также имеют проверки if и несколько операторов for:

>>>> word = 'letters'

>>>> letter_counts = {letter: word.count(letter) for letter in word}

>>>> letter_counts

>{'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1}

Мы запускаем цикл, проходя по каждой из семи букв в строке letters, и считаем, сколько раз появляется эта буква. Два наших вызова word.count(letter) — это лишь пустая трата времени, поскольку нам нужно подсчитать буквы «e» и «t» два раза. Но когда мы считаем буквы «e» во второй раз, то не причиняем вреда, поскольку лишь заменяем уже существующую запись в словаре; то же относится и к подсчету букв «t». Следующий способ решения задачи более характерен для Python:

>>>> word = 'letters'

>>>> letter_counts = {letter: word.count(letter) for letter in set(word)}

>>>> letter_counts

>{'t': 2, 'l': 1, 'e': 2, 'r': 1, 's': 1}