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