Dict comprehension в Python

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

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

Но того же результата можно достичь, используя более лаконичную конструкцию – dict comprehension (на русский переводится как представление словаря или генератор словаря).

Что такое dict comprehension?

Возможно, вы знакомы с list comprehension – способом создания списков из других списков. Dict comprehension – это способ создания словаря из другого словаря или из любого другого итерируемого объекта.

Примечание. Если хотите почитать не только о генераторах словарей, но и о других генераторах, обратите внимание на статью “List comprehensions и другие comprehensions в Python”.

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

При создании словаря с помощью dict comprehension нам нужно получить пару ключ-значение из какого-нибудь словаря или из любого другого итерируемого объекта.

Синтаксис dict comprehension может быть следующим:

myDict = {key: value for var in iterable} 

Здесь key: value – пара ключ-значение, а iterable – итерируемый объект.

При создании словаря из списка или кортежа с использованием их элементов в качестве ключей и значений мы можем использовать следующий синтаксис:

myDict = {key: value for var in list_name} 
myDict = {key: value for var in tuple_name} 

Здесь list_name – имя списка, а tuple_name – имя кортежа.

Синтаксис для создания словаря из другого словаря (здесь – dict_name):

myDict = {key: value for (key, value) in dict_name.items()} 

Как использовать dict comprehension?

При помощи dict comprehension можно создать словарь, используя элементы из списка. Предположим, мы хотим создать словарь Python с элементами списка в качестве ключей и значений. Мы можем сделать это следующим образом:

myList = [1, 2, 3, 4]
myDict = {x: x for x in myList}
print("List is:")
print(myList)
print("Created dictionary is:")
print(myDict)

Вывод:

List is: 
[1, 2, 3, 4] 
Created dictionary is: 
{1: 1, 2: 2, 3: 3, 4: 4}

Как видите, созданный словарь имеет ключи и значения, соответствующие элементам списка.

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

myList = [1, 2, 3, 4]
myDict = {x: x ** 2 for x in myList}
print("List is:")
print(myList)
print("Created dictionary is:")
print(myDict)

Вывод:

List is:
[1, 2, 3, 4]
Created dictionary is:
{1: 1, 2: 4, 3: 9, 4: 16}

На выходе мы видим, что созданный словарь имеет элементы списка в качестве ключей и их квадраты в качестве значений.

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

myList = [1, 2, 3, 4]
myDict = {x: x ** 2 for x in myList if x % 2 == 0}
print("List is:")
print(myList)
print("Created dictionary is:")
print(myDict)

Вывод:

List is:
[1, 2, 3, 4]
Created dictionary is:
{2: 4, 4: 16}

В выводе видно, что в качестве ключей словаря использованы только четные элементы списка. Их квадраты стали соответствующими значениями ключей словаря.

Создание словаря из другого словаря

Мы также можем создать словарь, используя элементы из другого словаря. Для этого можно извлечь пары ключ-значение из исходного словаря с помощью метода items(). Метод items() возвращает список кортежей с парами (ключ, значение), которые мы можем использовать для создания нового словаря.

Например, при помощи dict comprehension можно создать новый словарь, идентичный исходному:

myDict = {1: 1, 2: 2, 3: 3, 4: 4}
print("Original Dictionary is")
print(myDict)
newDict = {key: value for (key, value) in myDict.items()}
print("New dictionary is:")
print(newDict)

Вывод:

Original Dictionary is
{1: 1, 2: 2, 3: 3, 4: 4}
New dictionary is:
{1: 1, 2: 2, 3: 3, 4: 4}

Как видите, новый словарь содержит те же пары ключ-значение, что и исходный.

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

myDict = {1: 1, 2: 2, 3: 3, 4: 4}
print("Original Dictionary is")
print(myDict)
newDict = {key: value ** 2 for (key, value) in myDict.items()}
print("New dictionary is:")
print(newDict)

Вывод:

Original Dictionary is
{1: 1, 2: 2, 3: 3, 4: 4}
New dictionary is:
{1: 1, 2: 4, 3: 9, 4: 16}

На выходе мы видим, что ключи нового словаря такие же, как и в исходном словаре, а значения равны квадратам значений исходного словаря.

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

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

myDict = {1: 1, 2: 2, 3: 3, 4: 4}
print("Original Dictionary is")
print(myDict)
newDict = {key: value ** 2 for (key, value) in myDict.items() if key % 2 == 0}
print("New dictionary is:")
print(newDict)

Вывод:

Original Dictionary is
{1: 1, 2: 2, 3: 3, 4: 4}
New dictionary is:
{2: 4, 4: 16}

На выходе мы видим, что в новом словаре ключами выступают только четные числа, а их значения возведены в квадрат.

Заключение

В этой статье мы рассмотрели, что такое dict comprehension и как с его помощью можно создавать словари.

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

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

Перевод статьи Aditya Raj “Dictionary Comprehension in Python”.

1 комментарий к “Dict comprehension в Python”

  1. Пингбэк: Как сохранить словарь в файл в Python - Примеры Python Turbo

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *