Словари: эффективное хранение данных по ключу - Python с нуля до Junior: Путь к первой работе в IT - Qpel.AI

Словари: эффективное хранение данных по ключу

В прошлых уроках мы освоили списки — мощный инструмент для хранения упорядоченных данных. Но что, если вам нужно хранить информацию не по порядковому номеру, а по уникальному имени или идентификатору? Например, данные о студенте по его имени или цену товара по названию. Для таких задач в Python есть словари (dictionaries).

Что такое словари и зачем они нужны?

Словарь в Python — это неупорядоченная коллекция элементов, где каждый элемент хранится как пара "ключ: значение" (key: value). Представьте обычный словарь: каждому слову (ключу) соответствует его определение (значение).

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

Словари незаменимы, когда нужно быстро найти информацию по её уникальному идентификатору, а не по индексу.

Создаём словари

Словари создаются с помощью фигурных скобок {} или функции dict(). Пары "ключ: значение" разделяются двоеточием, а сами пары — запятыми.

# Пустой словарь
empty_dict = {}
another_empty_dict = dict()

# Словарь с данными о пользователе
user_profile = {
    "name": "Иван",
    "age": 30,
    "city": "Москва",
    "is_active": True
}

# Словарь с ценами на фрукты
fruit_prices = {
    "apple": 120,
    "banana": 80,
    "orange": 150
}

print(user_profile)
print(fruit_prices)

Важно: До Python 3.7 порядок элементов в словаре не гарантировался. Начиная с Python 3.7, порядок вставки сохраняется, но не стоит полагаться на это как на основное свойство словаря. Главное — это доступ по ключу.

Получаем доступ к элементам словаря

Доступ к значениям осуществляется по их ключам, используя квадратные скобки [].

user_profile = {
    "name": "Иван",
    "age": 30,
    "city": "Москва"
}

print(f"Имя пользователя: {user_profile['name']}")
print(f"Возраст пользователя: {user_profile['age']}")

# Попытка доступа к несуществующему ключу вызовет ошибку KeyError
# print(user_profile['country']) # Ошибка!

Чтобы безопасно получить значение, если ключ может отсутствовать, используйте метод get(). Он позволяет указать значение по умолчанию, которое будет возвращено, если ключ не найден.

print(f"Город пользователя: {user_profile.get('city')}")
print(f"Страна пользователя (по умолчанию 'Неизвестно'): {user_profile.get('country', 'Неизвестно')}")

Изменяем и добавляем элементы

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

user_profile = {
    "name": "Иван",
    "age": 30,
    "city": "Москва"
}

# Изменяем значение существующего ключа
user_profile["age"] = 31
print(f"Новый возраст: {user_profile['age']}")

# Добавляем новый элемент
user_profile["email"] = "ivan@example.com"
print(user_profile)

# Добавляем ещё один элемент
user_profile["occupation"] = "Разработчик"
print(user_profile)

Удаляем элементы

Для удаления элементов из словаря используйте оператор del или метод pop().

  • del: Удаляет элемент по ключу. Если ключа нет, вызовет KeyError.
  • pop(key, default_value): Удаляет элемент по ключу и возвращает его значение. Если ключ не найден, можно указать значение по умолчанию, которое будет возвращено, иначе вызовет KeyError.
user_profile = {
    "name": "Иван",
    "age": 31,
    "city": "Москва",
    "email": "ivan@example.com"
}

# Удаляем элемент с помощью del
del user_profile["email"]
print(f"После удаления email: {user_profile}")

# Удаляем элемент с помощью pop()
removed_city = user_profile.pop("city")
print(f"Удалённый город: {removed_city}")
print(f"После удаления города: {user_profile}")

# Пытаемся удалить несуществующий ключ с pop() и значением по умолчанию
not_existing_key = user_profile.pop("country", "Ключ не найден")
print(f"Результат pop для несуществующего ключа: {not_existing_key}")

# Очищаем весь словарь
user_profile.clear()
print(f"После очистки: {user_profile}")

Полезные методы словарей

keys(), values(), items()

Эти методы возвращают "представления" (view objects) ключей, значений или пар "ключ-значение". Эти представления динамически обновляются при изменении словаря.

student = {
    "id": 101,
    "name": "Анна",
    "major": "Информатика",
    "gpa": 4.5
}

# Получаем все ключи
all_keys = student.keys()
print(f"Ключи: {all_keys}")

# Получаем все значения
all_values = student.values()
print(f"Значения: {all_values}")

# Получаем все пары "ключ: значение"
all_items = student.items()
print(f"Пары: {all_items}")

# Пример: итерация по ключам
print("\nИтерация по ключам:")
for key in student.keys():
    print(key)

# Пример: итерация по значениям
print("\nИтерация по значениям:")
for value in student.values():
    print(value)

# Пример: итерация по парам "ключ: значение"
print("\nИтерация по парам 'ключ: значение':")
for key, value in student.items():
    print(f"{key}: {value}")

update()

Метод update() позволяет объединять словари или добавлять пары "ключ: значение" из другого словаря или итерируемого объекта.

user_info = {
    "name": "Олег",
    "age": 28
}

additional_info = {
    "city": "Санкт-Петербург",
    "email": "oleg@example.com"
}

user_info.update(additional_info)
print(f"После update: {user_info}")

# Если ключи совпадают, значения из обновляющего словаря перезапишут старые
new_age_info = {"age": 29, "occupation": "Инженер"}
user_info.update(new_age_info)
print(f"После второго update: {user_info}")

Проверяем наличие ключа

Чтобы проверить, существует ли ключ в словаре, используйте оператор in.

product = {
    "name": "Ноутбук",
    "price": 75000,
    "available": True
}

if "price" in product:
    print(f"Цена ноутбука: {product['price']} руб.")

if "color" not in product:
    print("Цвет не указан в описании продукта.")

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

Представьте, что вы разрабатываете систему для учёта оценок студентов.

  1. Создайте словарь student_grades, где ключами будут имена студентов (строки), а значениями — списки их оценок (целые числа). Добавьте данные для 3-4 студентов. Пример: {"Иванов": [4, 5, 3, 5], "Петрова": [5, 5, 4]}
  2. Добавьте новому студенту "Сидоров" оценки: [3, 4, 3].
  3. Измените одну из оценок для "Иванова" (например, первую оценку с 4 на 5).
  4. Выведите на экран средний балл для каждого студента. Подсказка: Для вычисления среднего используйте сумму элементов списка (sum()) и количество элементов (len()).
  5. Удалите студента "Петрова" из словаря.
  6. Проверьте, есть ли студент "Козлов" в словаре, и выведите соответствующее сообщение.
# Ваш код здесь

Итоги и что дальше?

Словари — мощный инструмент для работы с данными, где важна ассоциация "ключ-значение". Они позволяют быстро получать доступ к информации и эффективно её организовывать. Вы научились создавать словари, работать с их элементами, а также использовать полезные методы для управления данными.

Теперь, когда вы освоили списки и словари, пришло время познакомиться с другими важными коллекциями данных в Python: кортежами и множествами. Они обладают своими уникальными свойствами и областями применения, которые мы рассмотрим на следующей странице. Готовы узнать, чем они отличаются и когда их лучше использовать? 😉