2.9. Словари

Словарь — это отображение ключей в значения. Каждый ключ ищется напрямую; словарь запоминает, какое значение было последним связано с этим ключом.

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

Используйте фигурные скобки с парами key: value или конструктор dict:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

Значениями могут быть любые типы — строки, числа, списки и даже другие словари:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
Словарь, показанный в виде двух столбцов: ключи слева, значения справа, со стрелками, связывающими каждую пару.

Каждый ключ в словаре отображается ровно в одно значение.

2.9.2. Доступ и проверка принадлежности

Индексация с помощью [] извлекает значение по ключу. Отсутствующий ключ вызывает KeyError:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

Для безопасного поиска используйте dict.get(). Он возвращает None для отсутствующего ключа или значение, которое вы передаёте вторым аргументом:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

Ключевое слово in проверяет принадлежность ключа, а не значения:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. Добавление, обновление и удаление

Присваивание d[key] добавляет запись, если ключ новый, и перезаписывает её, если он уже существует:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

Удаление имеет несколько форм:

  • del d[key] — удаляет запись; вызывает KeyError, если ключ отсутствует.

  • dict.pop() — удаляет и возвращает значение; необязательное значение по умолчанию позволяет избежать исключения.

  • dict.clear() — удаляет все записи.

dict.update() объединяет другой словарь (или список пар (key, value)) с получателем, перезаписывая все совпадающие ключи:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. Итерация

Прямая итерация по словарю даёт его ключи в порядке вставки:

for k in person:
    print(k)

Три представления дают явный доступ:

  • dict.keys() — ключи (то же, что и итерация по словарю).

  • dict.values() — значения.

  • dict.items() — кортежи (key, value), идеально подходящие для распаковки в цикле.

for key, value in person.items():
    print(key, "=", value)

2.9.5. Что может быть ключом

Ключи словаря должны быть хешируемыми — их значение не может меняться в течение их жизни. Распространённые хешируемые типы:

Изменяемые типы, такие как list, dict и bytearray, не могут быть ключами; использование одного из них вызывает TypeError. Кортежи из неизменяемых значений — это стандартный способ индексировать словарь по составному идентификатору, например по координате двумерной сетки:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. Длина

len() возвращает количество записей:

>>> len(person)
4