>[выражение 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}