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 лекция
Недоступна
В глубинах самых глубин.
В глубинах самых глубин.
Комментарии (17)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
EvgenyXIV Уровень 31
27 марта 2026
В глубинах самых глубин. Надо обрабатывать все ключи на всех уровнях, так как могут быть одинаковые ключи на разных уровнях... Например, так, в первом приближении)) (Везде d - многоуровневый словарь): # Функция изменяет на new_value значения c ключом key на всех уровнях вложенного словаря def change_key(d, key, new_value): if key in d: d[key] = new_value for k, value in d.items(): if isinstance(value, dict): change_key(value, key, new_value) # Функция добавляет новый элемент (new_key, new_value) в первый встреченный заданный (по имени level) уровень вложенного словаря def add_key(d, new_key, new_value, level=None): if level is None: if new_key not in d: d[new_key] = new_value return True for k, value in d.items(): if k == level and isinstance(value, dict) and new_key not in value: value[new_key] = new_value return True elif isinstance(value, dict): if add_key(value, new_key, new_value, level): return True # Функция удаляет элементы ключом key на всех уровнях вложенного словаря def del_key(d, key): if key in d: del d[key] for k, value in d.items(): if isinstance(value, dict): del_key(value, key)
PaPaY Уровень 13
24 марта 2026

user_info_dict = {"name":"Роман",
                  "age": 22,
                  "address":{
                        "city": "Riga",
                        "street": "Very Hot",
                        "house": 45
                  },
                  "contact_info":{
                        "email":"barbos@hub.com",
                        "phone":"123-456-7890"
                  }
}
user_info_dict["name"] = "Barbos"
print(user_info_dict)
user_info_dict["address"]["street"] = "QWERTY"
print(user_info_dict)
user_info_dict["contact_info"]["telegram"] = "@barboshub"
print(user_info_dict)
del user_info_dict["address"]
print(user_info_dict)
del user_info_dict["contact_info"]["telegram"]
print(user_info_dict)
PaPaY Уровень 13
24 марта 2026

user_info_dict = {"имя":"Роман",
                  "возраст": 22,
                  "адрес": "Киев",
                  "контактна информация":{
                      "телефон":"123-456-7890",
                      "пол":"мужской"
                  }
}

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(user_info_dict)
John Preston Уровень 13
13 марта 2026
Чтобы не мучаться с последней задачей) person = {'name': 'Name', 'age': 25, 'address': {'city': 17, 'street': 'sezam', 'house': 'md'}, 'contact_info': {'email': 'some_mail@mail.ru', 'phone': '5555555'}} person['name'] = 'New' person['age'] = 26 person['address']['city'] = 18 person['address']['kek'] = 'lol' del person['address']['kek'] del person['age']
Анатолий Уровень 63
28 января 2026
❤️
Александр Уровень 22
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
Боги! Наконец-то это последняя лекция по коллекциям! Достали меня они уже! А тут ещё подача такая тяжелая. Одно и тоже постоянно мусолят! Думаю дальше будет лучше.
Андрей Уровень 74
12 июля 2025
У меня у одного требуют в первом задании создать функцию которая будет выполняться рекурсивно? При этом про саму рекурсию планируют рассказывать только в конце всего обучения!!!
Марина Уровень 14
1 апреля 2025
А только у меня в конце темы про словари тест на github?
SWK Уровень 26
28 марта 2025
Текст "иметь возможность" в требованиях совершенно лишний.

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

Программа должна добавлять новый элемент во вложенный словарь.