Генераторы множеств и словарей очень похожи на генераторы списков, которые мы уже рассматривали. Поэтому здесь рассмотрим сразу оба генератора и для множеств и для словарей.
Начнем по порядку.
Генератор множеств (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
, если условие верно, то в качестве значения добавляем 'четное'
, иначе 'нечетное'
.
Содержание: