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

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

  1. Обратиться к словарю внутри словаря по его ключу
  2. Обратиться к значению словаря по связанному ключу

Давайте рассмотрим доступ к значениям вложенного словаря 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. Поскольку значение, связанное с этим ключом, также является словарем, к его значениям тоже можно обратиться по соответствующим ключам.

Этот процесс можно разбить на следующие шаги:

  1. Обратиться к внутреннему словарю и сохранить его в переменной
  2. Обратиться к значению внутри вложенного словаря и сохранить его в другой переменной

Например:

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. Это гораздо лучше, чем аварийное завершение программы.

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

  1. Вызовите метод dictionary.get() для внешнего словаря, чтобы получить доступ к внутреннему
  2. Используйте if-else, чтобы убедиться, что возвращаемое значение – не None
  3. Вызовите 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

Заключение

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

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

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

  1. Сначала обратитесь по ключу к внутреннему словарю
  2. Затем обратитесь по ключу к значению внутреннего словаря

Спасибо, что прочитали. Успешного кодинга!

Перевод статьи Artturi Jalli “Python How to Access Nested Dictionary (with 5+ Examples)”.

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

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