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"],
}
A dictionary shown as two columns: keys on the left, values on the right, with arrows linking each pair.

Кожен ключ у словнику відповідає рівно одному значенню.

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. Кортежі незмінних значень є стандартним способом використовувати складені ідентифікатори (наприклад, координати в 2D-сітці) як ключі словника:

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

2.9.6. Довжина

len() повертає кількість записів:

>>> len(person)
4