Ищете сложную структуру данных для своего приложения? Научитесь создавать вложенный словарь в 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.