Урок 28 Словари

dict, ключи и значения, методы

⏱ ~15 мин чтения· 📘 Базовый

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

Словарь — упорядоченная коллекция пар ключ-значение (начиная с Python 3.7 порядок вставки сохраняется):

# Через фигурные скобки
student = {
    "name": "Иван",
    "age": 20,
    "city": "Москва"
}

# Через функцию dict()
person = dict(name="Анна", age=25, city="СПб")

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

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

Получение и изменение значений:

student = {"name": "Иван", "age": 20}

# Через ключ
print(student["name"])   # "Иван"
# Несуществующий ключ вызовет KeyError: student["grade"]

# Через get() — безопасно (не вызывает ошибку)
print(student.get("age"))     # 20
print(student.get("grade"))   # None
print(student.get("grade", "Нет"))  # "Нет" (значение по умолчанию)

# Изменение
student["age"] = 21
student["grade"] = 5  # добавление нового ключа

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

Основные методы:

d = {"a": 1, "b": 2, "c": 3}

print(d.keys())    # dict_keys(['a', 'b', 'c'])
print(d.values())  # dict_values([1, 2, 3])
print(d.items())   # dict_items([('a', 1), ('b', 2), ('c', 3)])

# Обновление
d.update({"b": 20, "d": 4})  # {"a": 1, "b": 20, "c": 3, "d": 4}

# Удаление
val = d.pop("a")     # удаляет и возвращает значение
last = d.popitem()   # удаляет и возвращает последнюю добавленную пару (ключ, значение)
d.clear()            # очищает словарь

# Проверка наличия ключа (после clear() словарь пуст)
print("a" in d)  # False

Перебор словаря

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

d = {"a": 1, "b": 2, "c": 3}

# По ключам
for key in d:
    print(key, d[key])

# По парам
for key, value in d.items():
    print(f"{key}: {value}")

# Только значения
for value in d.values():
    print(value)

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

Ключи словаря должны быть хешируемыми (обычно это неизменяемые объекты). Причина та же, что и у элементов множества: словарь находит значение по хешу ключа (см. урок 26), а хеш изменяемого объекта мог бы измениться. Поэтому кортеж можно использовать в качестве ключа, а список — нельзя:

coordinates = {
    (0, 0): "начало координат",
    (1, 2): "точка A",
}

print(coordinates[(0, 0)])  # "начало координат"
# coordinates[[1, 2]] = "x"  # Ошибка! TypeError — список изменяем, ключом быть не может

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

# {(1, [2, 3]): "x"}  # Ошибка! TypeError — список внутри кортежа изменяем