Какие есть альтернативы dict для структур данных в Python?
Что проверяют
Знаете ли вы стандартную библиотеку дальше базовых типов и умеете ли выбрать структуру под задачу: подсчёт, группировку, неизменяемость, строгую схему. Следом часто спрашивают, зачем нужен OrderedDict, если обычный dict и так хранит порядок.
Как отвечать
Сгруппируйте альтернативы по назначению. Словари с особым поведением из collections:
defaultdict: создаёт значение по фабрике при обращении к отсутствующему ключу, удобно для группировки черезdefaultdict(list);Counter: подсчёт элементов,most_common(), сложение и вычитание счётчиков;OrderedDict: порядок вставки гарантирован и у обычногоdictс Python 3.7, но уOrderedDictестьmove_to_end(),popitem(last=False)и сравнение с учётом порядка. На нём легко написать LRU;ChainMap: несколько словарей как один с поиском по цепочке, подходит для слоёв конфигурации;types.MappingProxyType: представление словаря только для чтения.
Записи с фиксированными полями вместо словаря со строковыми ключами:
dataclass: типизированные поля,frozen=Trueдля неизменяемости,slots=Trueс Python 3.10 для экономии памяти;NamedTuple: неизменяемый и лёгкий, распаковывается как кортеж;TypedDict: в рантайме остаётся обычнымdict, но даёт подсказки для mypy и IDE;- модели Pydantic: валидация и приведение типов на входе, стандарт для FastAPI.
Отдельно упомяните shelve, если данные должны пережить перезапуск, и frozenset или кортеж, если нужен хэшируемый ключ.
Где спотыкаются
Говорят, что OrderedDict нужен ради порядка элементов. Для этого он давно не нужен, называть надо его дополнительные методы.
Путают TypedDict с проверкой в рантайме. Интерпретатор не проверяет ни ключи, ни типы, это только статический анализ.
Тащат через весь код словарь с десятком строковых ключей вместо dataclass. Опечатка в ключе всплывает как KeyError на проде, а не как подсветка в редакторе.