Словари (Dictionaries) в Python
Словари (Dictionaries) в Python
Определение
Словарь (dict) — это изменяемая коллекция, хранящая данные в виде пар ключ-значение. Ключи должны быть хешируемыми (hashable), а значения могут быть любыми объектами. Словари не поддерживают индексы, как списки, но обеспечивают быстрый доступ к данным по ключу.
my_dict = {"name": "Alice", "age": 30, "city": "London"}
Свойства
- Уникальность ключей: Каждый ключ может встречаться только один раз.
- Изменяемость: Словарь можно изменять (добавлять, удалять элементы).
- Динамический размер: Размер меняется по мере добавления/удаления элементов.
- Порядок элементов: Начиная с Python 3.7, словари сохраняют порядок добавления элементов.
Основные методы и операции
1. Доступ и изменение элементов
print(my_dict["name"]) # Alice (KeyError, если ключа нет)
print(my_dict.get("name", "Unknown")) # Alice (без ошибки)
my_dict["age"] = 31 # Обновление
my_dict["country"] = "UK" # Добавление
2. Методы
- keys(): Возвращает итерируемый объект с ключами.
- values(): Возвращает значения.
- items(): Возвращает пары (ключ, значение).
- pop(key): Удаляет ключ и возвращает его значение.
- update(): Обновляет словарь из другого словаря.
- setdefault(key, default): Возвращает значение ключа или устанавливает default.
for key, value in my_dict.items():
print(f"{key}: {value}")
3. Удаление
del my_dict["city"] # Удаление элемента
my_dict.pop("age") # Удаление с возвратом значения
my_dict.clear() # Очистка словаря
Итерация и генераторы словарей
Словари можно итерировать по ключам, значениям или парам:
# Итерация по ключам
for key in my_dict:
print(key)
# Генератор словаря
squares = {x: x**2 for x in range(5)}
even_squares = {k: v for k, v in squares.items() if v % 2 == 0}
OrderedDict
Класс OrderedDict (из модуля collections) сохранял порядок элементов в версиях Python до 3.7. В современных версиях обычные словари также сохраняют порядок, но OrderedDict предлагает дополнительные методы:
- move_to_end(key): Перемещает ключ в конец.
- popitem(last=True): Удаляет последний или первый элемент.
from collections import OrderedDict
od = OrderedDict([("a", 1), ("b", 2)])
od.move_to_end("a")
defaultdict
defaultdict (из модуля collections) автоматически создает значения для отсутствующих ключей, используя фабричную функцию.
from collections import defaultdict
# Пример: группировка слов по длине
words = ["apple", "cat", "dog", "banana"]
dd = defaultdict(list)
for word in words:
dd[len(word)].append(word)
print(dd) # {5: ['apple'], 3: ['cat', 'dog'], 6: ['banana']}
Hashable в Python
Ключами словаря могут быть только хешируемые объекты:
- Хешируемые: числа, строки, кортежи (с неизменяемыми элементами).
- Нехешируемые: списки, словари, множества.
Хешируемость означает, что объект имеет метод __hash__(), который возвращает уникальное целое число, и его значение никогда не меняется.
# Проверка хешируемости
print(hash("Python")) # Работает
print(hash((1, 2))) # Работает
# hash([1, 2]) # Ошибка: список нехешируем
Заключение
Словари — один из самых мощных типов данных в Python. Они эффективны для поиска, вставки и удаления элементов. Использование defaultdict и OrderedDict расширяет их функционал, а понимание хешируемости помогает избегать ошибок при работе с ключами.