Словники (Dict)¶
Довідник. Ноутбук уроку, де словники з'являються вперше в контексті задачі (накопичувальний словник чайових), — Урок 6.
Словник (dict) у Python — це фундаментальна структура даних, яка зберігає довільну кількість об'єктів у вигляді пар «ключ-значення». Словники часто називають асоціативними масивами або хеш-таблицями.
1. Як працюють ключі та хеш-таблиці¶
Внутрішньо словники реалізовані як хеш-таблиці — спеціальна структура даних, яка забезпечує неймовірно швидкий пошук, додавання й видалення елементів (у середньому за константний час O(1)).
Механізм роботи (хешування)¶
- Коли додається пара «ключ-значення», Python пропускає ключ через спеціальну хеш-функцію.
- Ця функція перетворює ключ на унікальне ціле число (хеш-значення).
- Отримане число використовується як індекс (адреса "кошика" у пам'яті), куди поміщається значення.
- Коли значення шукається за ключем, 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)
Результат:
Читання та пошук даних¶
| Метод | Опис |
|---|---|
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.