Словари: ключи, значения, добавление и обновление
Словари: ключи, значения, добавление и обновление
Списки хранят элементы по индексу (0, 1, 2...). Но часто нужно хранить данные по имени: «имя» → «Алиса», «возраст» → 25, «город» → «Москва». Для таких задач Python предоставляет словарь (dict) — коллекцию пар ключ-значение.
Что такое словарь
Словарь — это коллекция пар ключ: значение. Ключи уникальны; значения могут повторяться. Словарь изменяемый и начиная с Python 3.7 — упорядоченный (элементы хранятся в порядке добавления).
person = {
"name": "Алиса",
"age": 25,
"city": "Москва"
}
print(person) # {'name': 'Алиса', 'age': 25, 'city': 'Москва'}
print(type(person)) # <class 'dict'>
Создание словаря
# Литерал:
empty = {}
scores = {"Alice": 92, "Bob": 85, "Carol": 97}
# Через dict():
config = dict(host="localhost", port=8080, debug=True)
# Из списка пар:
pairs = [("a", 1), ("b", 2), ("c", 3)]
d = dict(pairs)
print(d) # {'a': 1, 'b': 2, 'c': 3}
Ключи: требования
Ключи должны быть неизменяемыми типами: строки, числа, кортежи. Списки как ключи — нельзя:
valid = {1: "один", "two": 2, (3, 4): "кортеж"} # все допустимы
# invalid = {[1, 2]: "список"} # TypeError: unhashable type: 'list'
Доступ по ключу
person = {"name": "Алиса", "age": 25}
print(person["name"]) # Алиса
print(person["age"]) # 25
# Несуществующий ключ вызывает KeyError:
# print(person["email"]) # KeyError: 'email'
Метод get() возвращает значение или None (или default) вместо ошибки:
print(person.get("email")) # None
print(person.get("email", "N/A")) # N/A (default)
print(person.get("name", "N/A")) # Алиса
Добавление и обновление
Присваивание по ключу: если ключ существует — обновляет значение; если нет — добавляет:
person = {"name": "Алиса", "age": 25}
person["city"] = "Москва" # добавить новый ключ
person["age"] = 26 # обновить существующий
print(person)
# {'name': 'Алиса', 'age': 26, 'city': 'Москва'}
Метод update() обновляет несколько пар сразу:
person.update({"age": 27, "email": "alice@example.com"})
print(person)
# {'name': 'Алиса', 'age': 27, 'city': 'Москва', 'email': 'alice@example.com'}
Удаление элементов
d = {"a": 1, "b": 2, "c": 3, "d": 4}
# del — удалить по ключу:
del d["b"]
print(d) # {'a': 1, 'c': 3, 'd': 4}
# pop() — удалить и вернуть значение:
val = d.pop("c")
print(val) # 3
print(d) # {'a': 1, 'd': 4}
# pop() с default — не вызывает KeyError:
val2 = d.pop("z", "нет такого")
print(val2) # нет такого
# clear() — очистить словарь:
d.clear()
print(d) # {}
Проверка наличия ключа
Оператор in проверяет ключи (не значения):
person = {"name": "Алиса", "age": 25}
print("name" in person) # True
print("email" in person) # False
print("Алиса" in person) # False — проверяются ключи, не значения!
setdefault: установить если нет
setdefault(key, default) возвращает значение по ключу. Если ключа нет — добавляет его с default и возвращает default:
counter = {}
counter.setdefault("python", 0)
counter["python"] += 1
counter.setdefault("python", 0) # ключ уже есть — не обнуляет
counter["python"] += 1
print(counter) # {'python': 2}
Это удобный паттерн для счётчиков и группировки.
Длина и информация
person = {"name": "Алиса", "age": 25, "city": "Москва"}
print(len(person)) # 3 — количество пар
print(list(person.keys())) # ['name', 'age', 'city']
print(list(person.values())) # ['Алиса', 25, 'Москва']
Проверь себя
Что выведет следующий код?
d = {"x": 10, "y": 20}
d["z"] = 30
d["x"] = 99
print(d.get("w", 0))
print(len(d))
d["z"] = 30→ добавляетzd["x"] = 99→ обновляетxd.get("w", 0)→ ключаwнет →0len(d)→ 3 ключа:x,y,z
Вывод: 0, затем 3.
Итог
- Словарь — коллекция пар
ключ: значение; ключи уникальны и неизменяемы. - Доступ:
d[key](KeyError если нет) илиd.get(key, default)(безопасно). - Добавление/обновление:
d[key] = value; удаление:del d[key]илиd.pop(key). update()обновляет несколько пар сразу.inпроверяет ключи, не значения.setdefault()удобен для счётчиков и инициализации.
В следующем уроке разберём, как перебирать словари через items(), keys(), values().