Чтобы понять, что такое вложенный словарь, давайте сразу рассмотрим пример. Допустим, у нас есть словарь students
, содержащий словари, которые, в свою очередь, содержат информацию об отдельных студентах. Нам нужно получить имя студента с идентификатором 123.
Чтобы обратиться ко вложенному словарю в Python, нужно применить оператор доступа дважды (или столько раз, сколько понадобится).
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} } name = students[123]['name'] print(name) # Вывод: # Alice
Что такое словарь в Python?
И на всякий случай, если вы новичок в Python, словарь – это неупорядоченная коллекция элементов.
student = {'name' : 'Alice', 'age': '23'}
Традиционный “одномерный” словарь содержит пары ключ-значение, как показано выше. Ключ – это метка значения, на которое он ссылается.
Например, вы можете получить имя и возраст учеников в приведенном выше словаре, обратившись к ним с помощью ключей:
name = student["name"] age = student["age"]
Итак, это лишь краткий обзор того, как работает словарь Python и как получить доступ к его значениям.
Что такое вложенный словарь?
Слово “вложенный” относится к похожим объектам, помещенным друг в друга. Вложенные словари в Python означают размещение словарей внутри словарей.
Например, здесь представлен вложенный словарь students
, который состоит из данных нескольких студентов, связанных с трехзначным студенческим идентификатором:
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} }
Здесь students
– это словарь словарей, где идентификатор студента является ключом, а словарь данных студента – значением.
Как получить доступ к элементу вложенного словаря?
Чтобы получить доступ к значению вложенного словаря в Python, необходимо:
- Обратиться к словарю внутри словаря по его ключу
- Обратиться к значению словаря по связанному ключу
Давайте рассмотрим доступ к значениям вложенного словаря students
из предыдущего раздела.
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} }
Чтобы выбрать студента из словаря студентов, необходимо знать его идентификатор.
Предположим, что я – Alice. Я пытаюсь получить доступ к данным обо мне в словаре с данными студентов. Я знаю, что мой студенческий ID – 123. Поэтому я могу обратиться к словарю при помощи этого ключа:
alice = students[123] print(alice) # Вывод: # {'name': 'Alice', 'age': '23'}
Выведены данные внутреннего словаря, связанного с Alice.
Чтобы получить доступ к определенному значению в данных, нужно снова обратиться по ключу к словарю, только теперь – к словарю, к которому уже был получен доступ.
Допустим, я хочу получить не все данные студента с идентификатором 123, а только его имя:
name = students[123]['name'] print(name) # Вывод: # Alice
Как видите, сначала мы обращаемся к словарю по ключу 123. Поскольку значение, связанное с этим ключом, также является словарем, к его значениям тоже можно обратиться по соответствующим ключам.
Этот процесс можно разбить на следующие шаги:
- Обратиться к внутреннему словарю и сохранить его в переменной
- Обратиться к значению внутри вложенного словаря и сохранить его в другой переменной
Например:
student = students[123] name = student["name"] print(name) # Вывод: # Alice
Более безопасный доступ к вложенным словарям
До сих пор мы обращались к значениям словаря, не задумываясь о том, что произойдет, если ключ не существует.
Давайте продолжим работать со словарем students
.
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} }
Важно понимать, что в предыдущем примере мы предполагали, что ключ, по которому мы обращаемся к словарю, в этом словаре есть. Но давайте посмотрим, что произойдет, если это не так.
Например, попробуем найти данные студента с ID 999:
student = students[999] print(student)
Это приводит к ошибке, которая выводит программу из строя:
Traceback (most recent call last): File "", line 6, in KeyError: 999
Но вы же не хотите, чтобы случайная опечатка при вводе значения привела к сбою всей программы.
Чтобы предотвратить это, можно использовать метод dictionary.get()
для более безопасного доступа к значениям. Если ключ, переданный в эту функцию, не существует, программа не упадет.
Например:
student = students.get(999) print(student) # Вывод: # None
Как видите, мы получаем не ошибку, а None
. Это гораздо лучше, чем аварийное завершение программы.
Чтобы получить доступ к вложенному словарю более безопасным способом, выполните следующие шаги:
- Вызовите метод
dictionary.get()
для внешнего словаря, чтобы получить доступ к внутреннему - Используйте
if-else
, чтобы убедиться, что возвращаемое значение – неNone
- Вызовите
dictionary.get()
для внутреннего словаря, чтобы получить соответствующее значение
Вот пример:
student = students.get(999) if student != None: name = student.get('name') print(name) else: print("Value not found") # Вывод: # Value not found
Поскольку в вложенный словарь students
не содержит ключа 999, вернулось значение None
. В результате был выполнен только блок else
.
Для сравнения, давайте убедимся, что этот код работает и тогда, когда ключ существует.
student = students.get(123) if student != None: name = student.get('name') print(student) else: print("Value not found") # Вывод: # Alice
Как видите, это более безопасный способ доступа к значениям вложенного словаря. Независимо от того, существуют эти значения или нет, программа не завершается с ошибкой.
Как добавить значение во вложенный словарь?
Чтобы внести новое значение во вложенный словарь, необходимо повторно использовать оператор доступа к словарю.
Например, давайте добавим новый ключ hobbies
к одному из объектов student
в словаре students
:
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} } students[123]['hobbies'] = ['Jogging', "Tennis", "Disc Golf"] print(students) # Вывод: # {123: {'name': 'Alice', 'age': '23', 'hobbies': ['Jogging', 'Tennis', 'Disc Golf']}, 321: {'name': 'Bob', 'age': '34'}}
Обратите внимание, что этот пример работает только в том случае, если ключ 123 существует. Если его нет, программа завершится аварийно. Поэтому убедитесь, что ключ есть в словаре, прежде чем добавлять к нему значение!
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} } target = 999 if target in students: students[target]['hobbies'] = ['Jogging', "Tennis", "Disc Golf"]
Как удалить значение из вложенного словаря?
Удаление значения из вложенного словаря ничем не отличается от удаления значения из одномерного словаря. Все, что вам нужно сделать, это получить доступ к значению и вызвать для него оператор del
.
Например, давайте удалим имя студента с идентификатором 123:
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} } del students[123]['name'] print(students) # Вывод: # {123: {'age': '23'}, 321: {'name': 'Bob', 'age': '34'}}
Как добавить еще один словарь во вложенный словарь?
Добавление нового словаря во вложенный словарь ничем не отличается от добавления нового значения в обычный словарь. Просто в качестве значения добавляется целый словарь.
Чтобы добавить новую пару ключ-значение, используйте оператор доступа к словарю. Передайте оператору доступа новый ключ в качестве аргумента и присвойте ему значение.
Например, добавим в словарь students
новый словарь с данными еще одного студента:
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} } students[999] = {'name' : 'Charlie', 'age': '20'} print(students) # Вывод: # {123: {'name': 'Alice', 'age': '23'}, 321: {'name': 'Bob', 'age': '34'}, 999: {'name': 'Charlie', 'age': '20'}}
Теперь в словаре три студента.
Как перебрать вложенный словарь?
В итерации словаря словарей нет ничего сложного. Используйте метод dictionary.items()
, чтобы преобразовать словарь в итерируемый формат. Затем присвойте ключ и значение временным переменным.
Например, давайте выведем имена студентов из словарей с их данными:
students = { 123: {'name' : 'Alice', 'age': '23'}, 321: {'name' : 'Bob', 'age': '34'} } for key, value in students.items(): print(f"{key}: {value['name']}")
Вывод:
123: Alice 321: Bob
Заключение
Сегодня вы узнали, как обращаться к словарям внутри словарей. Другими словами, вы узнали, как работать со вложенными словарями.
Вложенный словарь – это такой словарь, значения которого также являются словарями.
Для доступа к этим вложенным словарям применяются те же правила, что и для доступа к обычным словарям.
- Сначала обратитесь по ключу к внутреннему словарю
- Затем обратитесь по ключу к значению внутреннего словаря
Спасибо, что прочитали. Успешного кодинга!
Перевод статьи Artturi Jalli “Python How to Access Nested Dictionary (with 5+ Examples)”.