📖 Теория

⚡ Кратко: теория

Counter подходит для популярных слов.

defaultdict(list) удобно группирует задачи и слова.

Поиск задач по категории можно сделать фильтрацией items().

OrderedDict позволяет менять порядок задач без создания новой очереди.

defaultdict(int) подходит для подсчёта посещений страниц.

global нужен только в задаче со счётчиком вызовов, но в проектах лучше избегать такой зависимости.

LRU-очередь можно моделировать через OrderedDict и move_to_end().

Каждое решение лучше оформлять функцией с понятными параметрами.

Топ-3 ошибки: не нормализовать регистр слов; создавать новую очередь вместо изменения исходной; забыть удалить старые элементы при превышении LRU-лимита.

Как читать практикум

Каждая задача тренирует выбор структуры данных, а не только синтаксис.

Если в задаче есть подсчёт, первым кандидатом будет Counter или defaultdict(int). Если есть группировка - defaultdict(list). Если важен порядок - OrderedDict.

from collections import Counter, defaultdict, OrderedDict

print(Counter(["a", "b", "a"]))
print(defaultdict(list))
print(OrderedDict())

Приоритет и порядок

Очередь с приоритетом можно перестроить на месте через move_to_end().

В практических задачах важно сохранить относительный порядок задач с одинаковым приоритетом.

from collections import OrderedDict

priorities = {"высокий": 0, "средний": 1, "низкий": 2}
tasks = OrderedDict({"task1": "низкий", "task2": "средний", "task3": "высокий"})
for key, value in sorted(list(tasks.items()), key=lambda item: priorities[item[1]]):
    tasks.move_to_end(key)
print(tasks)

LRU-очередь

Если задача пришла повторно, её нужно считать недавно использованной и переместить в конец.

Если размер превышен, удаляется самый старый элемент.

from collections import OrderedDict

cache = OrderedDict.fromkeys(["task1", "task2"])
cache.move_to_end("task1")
cache["task3"] = None
while len(cache) > 2:
    cache.popitem(last=False)
print(list(cache))
Проверить по документации: современные детали поведения встроенных функций, стандартной библиотеки и версии Python сверяйте с официальной документацией.