Генераторы множеств и словарей в Python

Работа с генераторами множеств и словарей в Python на примерах

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

Начнем по порядку.

Генератор множеств

Генератор множеств (set comprehension) — способ создания множеств из итерируемых объектов (списки, строки, кортежи, словари, другие множества).

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

Синтаксис генератора множеств

new_set = { выражение for элемент in последовательность if условие }

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

Примеры генератора множеств

Допустим, у нас есть список чисел: 1, 2, 3, 4, 5. Нам нужно создать множество, содержащее числа из этого списка, которые больше 2.

lst = [1, 2, 3, 4, 5]
my_set = {i for i in lst if i > 2}
print(my_set)
#{3, 4, 5}

Здесь мы на каждой итерации цикла, брали 1 значение из списка, проверяли условие i > 2 (что это значение больше 2) и если условие верно, то записывали этот элемент в множество.

Теперь давайте сгенерируем множество из диапазона чисел от 1 до 10 и каждое число возведем в квадрат:

my_set = {i ** 2 for i in range(1, 11)}
print(my_set)
#{64, 1, 4, 36, 100, 9, 16, 49, 81, 25}

Создание множество из цифр числа

Допустим, у нас есть число 2022, разобьем это число на цифры и создадим из них множество:

n = 2022
my_set = {int(i) for i in str(n)}
print(my_set)
#{0, 2}

Для этого мы преобразовали число 2022 в строку и каждой итерацией цикла брали по одному элементу из этой строки. Далее с помощью функции int() преобразовывали элемент в число и записывали в множество.

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

Генератор словарей

Генератор словарей (dict comprehension) — способ создания словарей из итерируемых объектов.

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

Синтаксис генератора словарей

Если нужно создать словарь на основе другого словаря синтаксис будет такой:

new_dict = { ключ:значение for (ключ,значение) in dict.items() if условие }

Мы можем в качестве ключа и значения задавать одну переменную, тогда словарь можно создать не только из другого словаря:

new_dict = { ключ:значение for (ключ,значение) in последовательность if условие }

На примерах приведенных ниже этот синтаксис станет более понятен.

Примеры генератора словарей

Создадим словарь из диапазона чисел от 0 до 4, с ключами, равными значениям из этого же диапазона:

my_dict = {i: i for i in range(5)}
print(my_dict)
#{0: 0, 1: 1, 2: 2, 3: 3, 4: 4}

Здесь в качестве ключа словаря и значения мы используем одну переменную — i.

Создадим словарь на основе другого словаря, все значения первого возведем в квадрат:

my_dict = {'key1': 1, 'key2': 2, 'key3': 3}
new_dict = {key: value ** 2 for key, value in my_dict.items()}
print(new_dict)
#{'key1': 1, 'key2': 4, 'key3': 9}

В цикле мы получаем на каждой итерации ключ key и значение value словаря my_dict с помощью метода my_dict.items(). И далее записываем тот же самый ключ и квадрат значения в новый словарь new_dict.

Создадим словарь, в котором ключами будут четные числа в диапазоне от 0 до 10, а значениями словаря будут квадраты этих чисел:

new_dict = {i: i ** 2 for i in range(11) if i % 2 == 0}
print(new_dict)
#{0: 0, 2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

Тут практически то же самое, что и в первом примере, но добавлено условие n % 2 == 0, для определения четности числа и i ** 2 для возведения в квадрат.

Определим четное и нечетное значение словаря

Допустим, у нас есть словарь {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f':6}, создадим на его основе новый словарь, значения которого будут четное или нечетно число имеет значение первого словаря.

dict_1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f':6}
new_dict = {key: ('четное' if value % 2 == 0 else 'нечетное') for key, value in dict_1.items()}
print(new_dict)
#{'a': 'нечетное', 'b': 'четное', 'c': 'нечетное', 'd': 'четное', 'e': 'нечетное', 'f': 'четное'}

Как обычно перебираем в цикле ключ и значение первого словаря с помощью метода dict_1.items(), в новый словарь добавляем ключ key, такой же, как и в первом словаре, но значение проверяем условием if value % 2 == 0, если условие верно, то в качестве значения добавляем 'четное', иначе 'нечетное'.

Содержание: