July 14, 2018

Генераторы списков и словарей

Зачастую нам надо получить список или словарь значений, которые отвечают каким-то требованиям. Обычно это делают следующим образом: создаём пустой массив, запускаем цикл и в нём добавляем те элементы, которые нам нужны. Однако в Python это действие можно сделать куда красивее в одну строчку используя, так называемые, генераторы списков. Рассмотрим пример:

squares = []  # Список квадратов чисел от 1 до 100
for i in range(1, 101):
	squares.append(i**2)

Теперь рассмотрим пример с генератором списка:

squares = [i**2 for i in range(1, 101)]

Намного короче и красивее. Синтаксис следующий:

[<значение> <условие на значение>]

Во втором блоке может быть однострочный цикл for и не один: никто не запрещает вкладывать один цикл в другой, а так же if. Рассмотрим более сложный пример:

different_pairs = []  # Список всех возможных пар неравных чисел от 0 до 9 
for i in range(10):
	for j in range(10):
		if i != j:
			matrix.append((i, j))

А теперь пример с генератором:

different_pairs = [(i, j) for i in range(10) for j in range(10) if i != j]

Красиво, не правда ли? А теперь представьте, что это можно делать не только со списками, но и со словарями. Там синтаксис чуть чуть иной:

{<ключ>:<значение> <условия на них>}

Допустим создадим словарь число : его куб от 0 до 9

cubes = {i: i**3 for i in range(10)}

Несмотря на то, что этот синтаксис довольно красивый, не стоит его использовать для очень сложных конструкций. Надеюсь, статья была вам полезной, и вы узнали что-то новое.

Материал для группы SnakeBlog