Перейти до змісту

Словники (Dict)

Довідник. Ноутбук уроку, де словники з'являються вперше в контексті задачі (накопичувальний словник чайових), — Урок 6.

Словник (dict) у Python — це фундаментальна структура даних, яка зберігає довільну кількість об'єктів у вигляді пар «ключ-значення». Словники часто називають асоціативними масивами або хеш-таблицями.

1. Як працюють ключі та хеш-таблиці

Внутрішньо словники реалізовані як хеш-таблиці — спеціальна структура даних, яка забезпечує неймовірно швидкий пошук, додавання й видалення елементів (у середньому за константний час O(1)).

Механізм роботи (хешування)

  1. Коли додається пара «ключ-значення», Python пропускає ключ через спеціальну хеш-функцію.
  2. Ця функція перетворює ключ на унікальне ціле число (хеш-значення).
  3. Отримане число використовується як індекс (адреса "кошика" у пам'яті), куди поміщається значення.
  4. Коли значення шукається за ключем, Python миттєво обчислює хеш ключа і відразу "перестрибує" до потрібного місця в пам'яті, замість того, щоб перебирати всі елементи по черзі.

Головне правило для ключів

Оскільки місце зберігання значення жорстко прив'язане до хешу ключа, ключі обов'язково мають бути незмінними (immutable) та хешованими об'єктами.

  • ✅ Дозволено: рядки (str), числа (int, float), логічні значення (bool), а також кортежі (tuple), якщо вони містять лише незмінні об'єкти.
  • ❌ Заборонено: списки (list), множини (set) та інші словники. Оскільки список може змінюватися, Python не може згенерувати для нього стабільний хеш — якщо список зміниться після того, як став ключем, словник більше ніколи не знайде відповідне значення.

2. Для чого найчастіше використовуються словники

  • Моделювання об'єктів та структур даних (записи): словники ідеально підходять для представлення об'єктів з іменованими полями (як структури в C або об'єкти в JSON), де ключі — назви полів, значення — їхній вміст (наприклад, {'name': 'Bob', 'age': 40, 'job': 'dev'}).
  • Створення пошукових довідників: словник працює як реальна телефонна книга — замість читання від кірки до кірки, миттєвий пошук номера за ім'ям. Або система DNS, що пов'язує доменне ім'я з IP-адресою.
  • Кешування (мемоізація): збереження результатів важких обчислень чи запитів до сервера; перед виконанням роботи програма перевіряє, чи є результат у словнику-кеші.
  • Підрахунок частоти: підрахунок кількості слів у тексті чи відвідувань сторінок — ключ це слово/подія, значення — лічильник.

3. Документація по методах словника

Словник створюється за допомогою фігурних дужок {} або функції dict().

user1 = {'name': 'Ivan', 'age': 30}
# Або
user2 = dict(name='Ivan', age=30)

print("User 1:", user1)
print("User 2:", user2)

Результат:

User 1: {'name': 'Ivan', 'age': 30}
User 2: {'name': 'Ivan', 'age': 30}

Читання та пошук даних

Метод Опис
get(key, [default]) Повертає значення за ключем. Якщо ключа немає — повертає None (або вказаний default), на відміну від прямого звернення d[key], яке викликає KeyError.
keys() Повертає динамічне представлення (view) всіх ключів словника.
values() Повертає динамічне представлення всіх значень словника.
items() Повертає пари "ключ-значення" у вигляді кортежів (key, value) — найпопулярніший спосіб перебору словника в циклі for.
user = {'name': 'Ivan', 'age': 30}

# get()
print("get('age'):", user.get('age', 0))
print("get('salary'):", user.get('salary', 0))  # ключа немає, поверне 0

# keys() та values()
print("Keys:", list(user.keys()))
print("Values:", list(user.values()))

# items()
print("\nПеребір через items():")
for key, value in user.items():
    print(f"{key}: {value}")

Результат:

get('age'): 30
get('salary'): 0
Keys: ['name', 'age']
Values: ['Ivan', 30]

Перебір через items():
name: Ivan
age: 30

Додавання та зміна даних

Метод Опис
update(other_dict) Оновлює словник даними з іншого словника (або ітерованого об'єкта з парами ключ-значення). Ключ уже існує — значення перезаписується; ні — створюється новий.
setdefault(key, [default]) Ключ є у словнику — повертає його значення. Ключа немає — вставляє ключ зі значенням default і повертає його.
# update()
d = {'a': 1, 'b': 2}
d.update({'b': 3, 'c': 4})
print("Після update:", d)

# setdefault()
d2 = {'a': 1}
val_b = d2.setdefault('b', 2)   # поверне 2 і додасть 'b': 2 у словник
val_a = d2.setdefault('a', 99)  # поверне 1, словник не зміниться

print("\nПісля setdefault:", d2)
print(f"Повернуті значення: val_b={val_b}, val_a={val_a}")

Результат:

Після update: {'a': 1, 'b': 3, 'c': 4}

Після setdefault: {'a': 1, 'b': 2}
Повернуті значення: val_b=2, val_a=1

Видалення даних

Метод Опис
pop(key, [default]) Видаляє пару за ключем і повертає її значення. Ключа немає і вказано default — повертає default, інакше KeyError.
popitem() Видаляє і повертає останню додану пару ключ-значення у вигляді кортежу (з Python 3.7 словники зберігають порядок додавання) — зручно для використання словника як стеку (LIFO).
clear() Повністю очищає словник.

Для видалення конкретного елемента без повернення його значення часто використовують оператор del, наприклад del d['key'].

# pop()
d = {'a': 1, 'b': 2}
val = d.pop('a')
print("Після pop('a'):", d, "| Видалене значення:", val)

# popitem()
d_stack = {'x': 10, 'y': 20}
k, v = d_stack.popitem()
print("Після popitem():", d_stack, "| Видалена пара:", k, v)

# clear() та del
d_stack.clear()
print("Після clear():", d_stack)

del_dict = {'key1': 'val1', 'key2': 'val2'}
del del_dict['key1']
print("Після del:", del_dict)

Результат:

Після pop('a'): {'b': 2} | Видалене значення: 1
Після popitem(): {'x': 10} | Видалена пара: y 20
Після clear(): {}
Після del: {'key2': 'val2'}


Дивись також: Списки · Кортежі та namedtuple · Множини — і накопичувальний словник як патерн (Counting/Aggregation/Grouping, defaultdict, Counter) у Уроці 6.