Вложенный словарь Python: создание иерархических структур данных

Ищете сложную структуру данных для своего приложения? Научитесь создавать вложенный словарь в Python.

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

Давайте рассмотрим, как создать и использовать этот тип данных!

Что такое вложенный словарь в Python?

Вложенный словарь Python — это словарь, содержащий один или несколько словарей в качестве значений. Это структура данных, которая позволяет хранить данные иерархически.

Как создать словарь с вложенной структурой в Python?

Ниже вы можете увидеть, как выглядит вложенный словарь:

data = {
    'key1': {'inner_key1': 'inner_value1'},
    'key2': {'inner_key2': 'inner_value2'}
}

Словарь данных имеет два ключа: key1 и key2. Значения, связанные с key1 и key2, также являются словарями. Вот почему мы называем это вложенным словарем. У нас есть словарь внутри словаря.

В этом примере мы использовали имена key1 и inner_key1, чтобы отличить ключи внешнего словаря от ключей внутреннего словаря.

Как получить доступ к элементам вложенного словаря с помощью Python

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

Например, чтобы получить доступ к значению inner_value2 в предыдущем словаре, можно использовать следующий синтаксис:

print(data['key2']['inner_key2'])

[output]
inner_value2

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

Как получить доступ к элементам вложенных словарей глубиной 3 уровня

Давайте посмотрим, как работает вложенный словарь, если углубиться на один уровень.

Мы определим вложенный словарь глубиной в 3 уровня:

data = {
    'key1': {'inner_key1': {'inner_inner_key1': 'inner_value1'}},
    'key2': {'inner_key2': {'inner_inner_key2': 'inner_value2'}}
}

Если мы получим доступ к значению inner_key1, то получим словарь:

print(data['key2']['inner_key2'])
print(type(data['key2']['inner_key2']))

[output]
{'inner_inner_key2': 'inner_value2'}
<class 'dict'>

Чтобы получить доступ к inner_value2, нам нужно добавить другой внутренний ключ к цепочке ключей, которую мы указали:

print(data['key2']['inner_key2']['inner_inner_key2'])

[output]
inner_value2

Логика одинакова для любого уровня вложенности, который вам необходим в вашей структуре данных.

Добавление элементов во вложенный словарь в Python

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

Давайте добавим элемент в исходный двухуровневый вложенный словарь и установим значение ключа равным key3.

Ниже вы можете увидеть первоначальный словарь:

data = {
    'key1': {'inner_key1': 'inner_value1'},
    'key2': {'inner_key2': 'inner_value2'}
}

Назначьте новый словарь для key3:

data['key3'] = {'inner_key3': 'inner_value3'}

И вывести обновленное значение вложенного словаря:

print(data)

[output]
{'key1': {'inner_key1': 'inner_value1'}, 'key2': {'inner_key2': 'inner_value2'}, 'key3': {'inner_key3': 'inner_value3'}}

Чтобы распечатать словарь в более удобном для чтения виде, можно использовать модуль Python pprint.

import pprint

pprint.pprint(data)

[output]
{'key1': {'inner_key1': 'inner_value1'},
 'key2': {'inner_key2': 'inner_value2'},
 'key3': {'inner_key3': 'inner_value3'}}

Определенно выглядит лучше!

Как обновить элемент во вложенном словаре

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

В качестве примера мы обновим значение inner_value3 до значения updated_inner_value3.

Начнем со следующего словаря:

{'key1': {'inner_key1': 'inner_value1'},
 'key2': {'inner_key2': 'inner_value2'},
 'key3': {'inner_key3': 'inner_value3'}}

Следующая строка кода обновляет значение inner_value3, обращаясь к значению, идентифицированному key3 и inner_key3.

import pprint

data['key3']['inner_key3'] = 'updated_inner_value3'
pprint.pprint(data)

[output]
{'key1': {'inner_key1': 'inner_value1'},
 'key2': {'inner_key2': 'inner_value2'},
 'key3': {'inner_key3': 'updated_inner_value3'}}

Из выходных данных видно, что мы обновили значение inner_value3 до updated_inner_value3.

Удаление элемента из вложенного словаря Python

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

Например, начнем со следующего словаря:

data = {
    'key1': {'inner_key1': 'inner_value1'},
    'key2': {'inner_key2': 'inner_value2'}
}

Чтобы удалить пару ключ-значение inner_key2: inner_value2, можно использовать следующий оператор Python:

del data['key2']['inner_key2']

Теперь распечатаем словарь:

pprint.pprint(data)

[output]
{'key1': {'inner_key1': 'inner_value1'}, 'key2': {}}

Вы можете видеть, что мы удалили пару ключ-значение, которая представляла значение ключа словаря key2. Вот почему значение key2 теперь является пустым словарем.

Давайте удалим key2 и связанное с ним значение.

del data['key2']
pprint.pprint(data)

[output]
{'key1': {'inner_key1': 'inner_value1'}}

Теперь остался только ключ key1 и связанный с ним словарь.

Как выполнить итерацию по вложенному словарю?

Имея вложенный словарь, как можно перебрать его с помощью цикла for в Python?

Прежде всего, откройте оболочку Python и определите вложенный словарь.

>>> data = {
...     'key1': {'inner_key1': 'inner_value1'},
...     'key2': {'inner_key2': 'inner_value2'}
... }

Теперь используйте функцию dir(), чтобы увидеть методы, предоставляемые этим словарем.

>>> dir(data)
['__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__ior__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__ror__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

Одним из методов, предоставляемых словарями, является items().

Давайте посмотрим, что возвращает этот метод в оболочке Python.

>>> data.items()
dict_items([('key1', {'inner_key1': 'inner_value1'}), ('key2', {'inner_key2': 'inner_value2'})])

Вот что произойдет, если мы используем цикл for для перебора элементов объекта, возвращаемого методом items().

>>> for x, y in data.items():
...     print("This is x: ", x)
...     print("This is y: ", y)
... 
This is x:  key1
This is y:  {'inner_key1': 'inner_value1'}
This is x:  key2
This is y:  {'inner_key2': 'inner_value2'}

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

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

Давайте напишем полный код Python для просмотра всех ключей и значений вложенного словаря.

for outer_key, inner_dict in data.items():
    print(outer_key)
    for inner_key, inner_value in inner_dict.items():
        print(f"{inner_key}: {inner_value}")

И вот что получается:

key1
inner_key1: inner_value1
key2
inner_key2: inner_value2

Этот код позволяет вам просматривать элементы вложенного словаря.

Стоит ли использовать вложенный словарь в Python?

Нет ничего плохого в использовании вложенного словаря в качестве структуры данных для ваших программ на Python.

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

Вот что я имею в виду. Возьмем следующий вложенный словарь:

data = {
    'key1': {'inner_key1': 'inner_value1'},
    'key2': {'inner_key2': 'inner_value2'}
}

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

new_data = {
    ('key1', 'inner_key1'): 'inner_value1',
    ('key2', 'inner_key2'): 'inner_value2'
}

Давайте посмотрим, как можно получить inner_value1 в обоих сценариях.

# Nested dictionary
print(data['key1']['inner_key1'])

# Dictionary with tuples as keys
print(new_data['key1', 'inner_key1'])

Убедитесь, что в обоих случаях на выходе получается inner_value1.

Заключение

В этом уроке по Python вы узнали, как работать с вложенными словарями Python. От их создания до доступа к их элементам, от обновления до удаления элементов.

Вы также увидели, как выполнять итерацию по вложенному словарю с помощью вложенного цикла for.

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.