Что такое словари в Python?

Словари (dictionaries) - это изменяемые коллекции, которые хранят пары ключ-значение. Каждый ключ в словаре уникален и используется для доступа к соответствующему значению.

Ключевые характеристики словарей

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

Словари можно создавать несколькими способами:

Создание словарей
# Пустой словарь
пустой_словарь = {}
print(пустой_словарь)  # Вывод: {}

# Словарь с элементами
возрасты = {"Анна": 25, "Борис": 30, "Виктория": 22}
print(возрасты)  # Вывод: {'Анна': 25, 'Борис': 30, 'Виктория': 22}

# Словарь с разными типами ключей и значений
смешанный = {
    "имя": "Иван",
    42: "ответ на главный вопрос",
    True: [1, 2, 3],
    (1, 2): "кортеж как ключ"
}
print(смешанный)

# Создание словаря с помощью dict()
словарь = dict(имя="Анна", возраст=25, город="Москва")
print(словарь)  # Вывод: {'имя': 'Анна', 'возраст': 25, 'город': 'Москва'}

# Создание словаря из списка кортежей
пары = [("a", 1), ("b", 2), ("c", 3)]
словарь_из_пар = dict(пары)
print(словарь_из_пар)  # Вывод: {'a': 1, 'b': 2, 'c': 3}

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

Элементы словаря доступны по ключу:

Доступ к элементам
# Словарь с информацией о студенте
студент = {
    "имя": "Анна",
    "возраст": 20,
    "курс": "Информатика",
    "средний_балл": 4.5
}

# Доступ к элементам по ключу
print(f"Имя: {студент['имя']}")           # Вывод: Имя: Анна
print(f"Возраст: {студент['возраст']}")   # Вывод: Возраст: 20

# Изменение значения
студент["возраст"] = 21
print(f"Новый возраст: {студент['возраст']}")  # Вывод: Новый возраст: 21

# Добавление нового элемента
студент["университет"] = "МГУ"
print(студент)

# Доступ с помощью get() (безопасный доступ)
print(студент.get("имя"))           # Вывод: Анна
print(студент.get("фамилия"))       # Вывод: None
print(студент.get("фамилия", "Не указано"))  # Вывод: Не указано

Методы словарей

Словари имеют множество полезных методов:

Основные методы словарей
# Исходный словарь
студент = {
    "имя": "Анна",
    "возраст": 20,
    "курс": "Информатика"
}
print(f"Исходный словарь: {студент}")

# keys() - получение всех ключей
print(f"Ключи: {list(студент.keys())}")

# values() - получение всех значений
print(f"Значения: {list(студент.values())}")

# items() - получение всех пар ключ-значение
print(f"Пары: {list(студент.items())}")

# update() - обновление словаря
студент.update({"средний_балл": 4.5, "университет": "МГУ"})
print(f"После update(): {студент}")

# pop() - удаление и возврат значения по ключу
возраст = студент.pop("возраст")
print(f"Удаленный возраст: {возраст}")
print(f"После pop(): {студент}")

# popitem() - удаление и возврат последней пары (в Python >= 3.7)
последняя_пара = студент.popitem()
print(f"Удаленная пара: {последняя_пара}")
print(f"После popitem(): {студент}")
Другие полезные методы
# Словарь
студент = {
    "имя": "Анна",
    "возраст": 20,
    "курс": "Информатика"
}

# setdefault() - установка значения по умолчанию
специальность = студент.setdefault("специальность", "Не указана")
print(f"Специальность: {специальность}")
print(f"Словарь: {студент}")

# clear() - очистка словаря
# студент.clear()
# print(f"После clear(): {студент}")

# copy() - создание копии словаря
копия = студент.copy()
print(f"Копия: {копия}")

# Проверка наличия ключа
if "имя" in студент:
    print(f"Имя студента: {студент['имя']}")

if "фамилия" not in студент:
    print("Фамилия не указана")

Итерация по словарям

Существует несколько способов перебора элементов словаря:

Итерация по словарям
# Словарь с оценками
оценки = {
    "Анна": 5,
    "Борис": 4,
    "Виктория": 5,
    "Дмитрий": 3
}

# Перебор ключей (по умолчанию)
print("Студенты:")
for студент in оценки:
    print(f"- {студент}")

# Перебор ключей с помощью keys()
print("\nСтуденты (с keys()):")
for студент in оценки.keys():
    print(f"- {студент}")

# Перебор значений
print("\nОценки:")
for оценка in оценки.values():
    print(f"- {оценка}")

# Перебор пар ключ-значение
print("\nСтуденты и их оценки:")
for студент, оценка in оценки.items():
    print(f"- {студент}: {оценка}")

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

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

Вложенные словари
# Словарь с информацией о студентах
студенты = {
    "Анна": {
        "возраст": 20,
        "курс": "Информатика",
        "оценки": [5, 4, 5, 5]
    },
    "Борис": {
        "возраст": 22,
        "курс": "Математика",
        "оценки": [4, 4, 3, 4]
    },
    "Виктория": {
        "возраст": 19,
        "курс": "Физика",
        "оценки": [5, 5, 5, 4]
    }
}

# Доступ к вложенным элементам
print(f"Курс Анны: {студенты['Анна']['курс']}")
print(f"Средний балл Бориса: {sum(студенты['Борис']['оценки']) / len(студенты['Борис']['оценки'])}")

# Перебор вложенных словарей
print("\nИнформация о студентах:")
for имя, информация in студенты.items():
    print(f"\n{имя}:")
    for ключ, значение in информация.items():
        if ключ == "оценки":
            print(f"  {ключ}: {значение} (средний балл: {sum(значение)/len(значение):.2f})")
        else:
            print(f"  {ключ}: {значение}")

Словарные включения (Dictionary Comprehensions)

Словарные включения - это компактный способ создания словарей:

Словарные включения
# Создание словаря квадратов чисел
# Обычный способ
квадраты = {}
for i in range(1, 6):
    квадраты[i] = i ** 2
print(квадраты)

# Словарное включение
квадраты = {i: i ** 2 for i in range(1, 6)}
print(квадраты)

# Словарное включение с условием
четные_квадраты = {i: i ** 2 for i in range(1, 11) if i % 2 == 0}
print(четные_квадраты)

# Создание словаря из двух списков
ключи = ["a", "b", "c"]
значения = [1, 2, 3]
словарь = {ключ: значение for ключ, значение in zip(ключи, значения)}
print(словарь)

# Преобразование строк в словаре
слова = ["привет", "мир", "python"]
длины = {слово: len(слово) for слово in слова}
print(длины)

Практические задания

Задания
  1. Создайте словарь с названиями стран и их столицами. Добавьте несколько новых стран и выведите все пары страна-столица.
  2. Напишите программу, которая подсчитывает частоту встречаемости букв в строке и сохраняет результат в словаре.
  3. Создайте словарь с информацией о товарах (название, цена, количество). Реализуйте функцию для подсчета общей стоимости товаров.
  4. Реализуйте функцию, которая объединяет два словаря, суммируя значения по одинаковым ключам.
Решения:

Задание 1:

# Словарь стран и столиц
страны = {
    "Россия": "Москва",
    "Франция": "Париж",
    "Германия": "Берлин"
}

# Добавление новых стран
страны.update({
    "Италия": "Рим",
    "Япония": "Токио",
    "Канада": "Оттава"
})

# Вывод всех пар
print("Страны и их столицы:")
for страна, столица in страны.items():
    print(f"{страна}: {столица}")

Задание 2:

def частота_букв(строка):
    частота = {}
    for символ in строка.lower():
        if символ.isalpha():  # Учитываем только буквы
            частота[символ] = частота.get(символ, 0) + 1
    return частота

# Тестирование
текст = "Программирование на Python"
результат = частота_букв(текст)
print(f"Частота букв в '{текст}':")
for буква, количество in sorted(результат.items()):
    print(f"{буква}: {количество}")

Задание 3:

# Словарь товаров
товары = {
    "яблоки": {"цена": 50, "количество": 10},
    "бананы": {"цена": 30, "количество": 5},
    "груши": {"цена": 60, "количество": 8}
}

def общая_стоимость(товары_словарь):
    общая_сумма = 0
    for товар, информация in товары_словарь.items():
        стоимость = информация["цена"] * информация["количество"]
        общая_сумма += стоимость
        print(f"{товар}: {стоимость} руб.")
    return общая_сумма

# Тестирование
print("Стоимость товаров:")
итого = общая_стоимость(товары)
print(f"Итого: {итого} руб.")

Задание 4:

def объединить_словари(словарь1, словарь2):
    результат = словарь1.copy()
    for ключ, значение in словарь2.items():
        if ключ in результат:
            результат[ключ] += значение
        else:
            результат[ключ] = значение
    return результат

# Тестирование
словарь_a = {"a": 1, "b": 2, "c": 3}
словарь_b = {"b": 3, "c": 4, "d": 5}

объединенный = объединить_словари(словарь_a, словарь_b)
print(f"Словарь A: {словарь_a}")
print(f"Словарь B: {словарь_b}")
print(f"Объединенный: {объединенный}")
Предыдущий урок Следующий урок