JavaRush /Курсы /Модуль 1: Python Core /Вложенные словари

Вложенные словари

Модуль 1: Python Core
7 уровень , 6 лекция
Открыта

7.1 Создание вложенных словарей

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

Создание вложенных словарей

Вот пример создания вложенного словаря:


person = {
    "name": "Alice",
    "details": {
        "age": 25,
        "city": "New York",
        "address": {
            "street": "123 Main St",
            "zip": "10001"
        },
        "mother": "Jane Smith"
    },
    "gender": "female"
}
print(person)  # Вывод: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}, 'mother': 'Jane Smith'}, 'gender': 'female'}

В этом примере person — это словарь, содержащий вложенный словарь details, который, в свою очередь, содержит другой вложенный словарь address.

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


address = {
    "street": "123 Main St",
    "zip": "10001"
}
         
details = {
    "age": 25,
    "city": "New York",
    "address": address
}
         
person = {
    "name": "Alice",
    "details": details,
    "gender": "female"
}
print(person)  # Вывод: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}}, 'gender': 'female'}

7.2 Доступ к элементам вложенного словаря

Доступ к элементам вложенных словарей простой и очевидный. Вот как это делается:

Доступ к элементам верхнего уровня


name = person["name"]
print(name)  # Вывод: Alice

Доступ к элементам вложенного словаря


age = person["details"]["age"]
city = person["details"]["city"]
print(age)  # Вывод: 25
print(city)  # Вывод: New York

Доступ к элементам более глубокого уровня вложенности


street = person["details"]["address"]["street"]
zip_code = person["details"]["address"]["zip"]
print(street)  # Вывод: 123 Main St
print(zip_code)  # Вывод: 10001

7.3 Изменение элементов вложенного словаря

Если вы уже разобрались, как выводить элементы любой степени вложенности, то изменение их будет ещё проще:

Изменение значений верхнего уровня


person["name"] = "Bob"
print(person["name"])  # Вывод: Bob

Изменение значений вложенного словаря


person["details"]["age"] = 26
print(person["details"]["age"])  # Вывод: 26

Изменение значений более глубокого уровня вложенности


person["details"]["address"]["city"] = "Los Angeles"
print(person["details"]["address"]["city"])  # Вывод: Los Angeles

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


person["details"]["phone"] = "123-456-7890"
print(person["details"]["phone"])  # Вывод: 123-456-7890

Удаление элементов верхнего уровня


# Удаляем элемент 'country' из словаря 'person'
del person["country"]
print(person)  # Элемент 'country' будет удален из словаря

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


# Удаляем элемент 'phone' из словаря 'details'
del person["details"]["phone"]
print(person["details"])  # Элемент 'phone' будет удален из словаря 'details'

7.4 Обход вложенных словарей

Существует несколько способов обойти все элементы словаря. Циклы – самый простой из них:

Итерация по элементам вложенного словаря


for key, value in person.items():  # Обходим родительский словарь
    if isinstance(value, dict):  # Если значение - это словарь
        for key2, value2 in value.items():  # Обходим элементы дочернего словаря
            print(f"{key} --> {key2}: {value2}")

Рекурсивная итерация по всем уровням вложенности


def print_dict(d, indent=0):
    for key, value in d.items():
        print("  " * indent + str(key) + ": ", end="")
        if isinstance(value, dict):
            print()
            print_dict(value, indent + 1)
        else:
            print(value)
        
print_dict(person)

Подробнее о рекурсии вы узнаете в теме «Алгоритмы и Структуры данных».

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


def find_key(d, key):
    if key in d:
        return d[key]
    for k, v in d.items():
        if isinstance(v, dict):
            result = find_key(v, key)
            if result:
                return result
    return None
        
phone = find_key(person, "phone")
print(phone)  # Вывод: None (поскольку элемент 'phone' был удален)
2
Задача
Модуль 1: Python Core, 7 уровень, 6 лекция
Недоступна
Обход словаря.
Обход словаря.
2
Задача
Модуль 1: Python Core, 7 уровень, 6 лекция
Недоступна
В глубинах самых глубин.
В глубинах самых глубин.
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Александр Уровень 12
2 ноября 2025
It looks better this way: def print_dict(adict, indent=0): for k, v in adict.items(): print('\t\t' * indent + str(k) + ': ', end='') ...
Vanil'ka Уровень 25
3 августа 2025
Боги! Наконец-то это последняя лекция по коллекциям! Достали меня они уже! А тут ещё подача такая тяжелая. Одно и тоже постоянно мусолят! Думаю дальше будет лучше.
Андрей Уровень 34
12 июля 2025
У меня у одного требуют в первом задании создать функцию которая будет выполняться рекурсивно? При этом про саму рекурсию планируют рассказывать только в конце всего обучения!!!
Марина Уровень 14
1 апреля 2025
А только у меня в конце темы про словари тест на github?
SWK Уровень 26
28 марта 2025
Текст "иметь возможность" в требованиях совершенно лишний.

Программа должна иметь возможность изменять значения элементов словаря верхнего уровня.
Программа должна иметь возможность изменять значения элементов вложенного словаря.
"Иметь возможность" означает, что должен быть какой-то интерфейс (API), с помощью которого пользователь (кто-то, пользующий API) может это сделать. Если в данной конкретной программе нужно что-то изменить, а имелось в виду именно это, нужно писать, как вот в этом пункте:

Программа должна добавлять новый элемент во вложенный словарь.
Денис Уровень 16
13 марта 2025
Еще одна ошибка в теории - 7.3 Изменение элементов вложенного словаря -> Изменение значений более глубокого уровня вложенности. Необходимо поменять город --> person["details"]["address"]["city"] = "Los Angeles" Но ключ 'city' при создании находится тут --> person["details"]["city"] Соответственно появляется еще один ключ, только на разных уровнях: словаре "details" и подсловаре "address". При поиске через рекурсию, ожидаемо выдает первый попавшийся результат - "New York", а не "Los Angeles"
Денис Уровень 16
13 марта 2025
Ошибка в теории - пункт 7.3.Удаление элементов верхнего уровня. Где необходимо удалить "country". Сложно удалить то, чего нет.. Такого ключа нет при создании словаря и не добавляли в процессе изучения темы
Sheo Gorath Уровень 15
25 февраля 2025
В последнем пункте последней задачи:

def del_low():
    del_low = input('Введите параметр который хотите удалить')
    if isinstance(person[del_low], dict):
        del_low2 = input('Введите параметр 2 который хотите удалить')
        del person[del_low][del_low2]
    else:
        del person[del_low]
    print(person)
Ему не понравилось что я проверяю через dict, хотя код работал( А как вы решили? Не нашла короткого и изящного решения не через проверку на dict((
Дмитрий Уровень 27
19 февраля 2025
Мне одному кажется, что вложенные словари похожи на JSON?
Mr.Robot Уровень 21 Expert
21 февраля 2025
Он и есть ) "Python - с нами удобно!" )
SWK Уровень 26
27 марта 2025
На HTML они похожи.
Андрей Уровень 26
3 декабря 2024
задача 1 - знакомство с рекурсией для спартанцев =)