Чтобы понять, что такое вложенный словарь, давайте сразу рассмотрим пример. Допустим, у нас есть словарь 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)».
