Как читать практикум
Каждая задача тренирует выбор структуры данных, а не только синтаксис.
Если в задаче есть подсчёт, первым кандидатом будет 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))