Counter(iterable)Частотный словарь: считает появление значений.
Похоже наdict, но выражает намерение.Быстрая программа начинается не с модуля, а с операции: что нужно часто добавлять, считать, выбирать или искать?
Не заменяй понимание названиями модулей. Сначала назови инвариант и сложность, затем выбери deque, Counter, кучу или двоичный поиск.
Counter(iterable)Частотный словарь: считает появление значений.
Похоже наdict, но выражает намерение.deque()Очередь с быстрым appendleft и popleft.
defaultdict(list)Создает значение по умолчанию для нового ключа.
Удобно при группировке, но обычныйdict.get иногда проще.namedtuple / dataclassДают именованные поля записи.
Для учебной пары часто достаточно обычного кортежа.| Инструмент | Задача | Не использовать вместо |
|---|---|---|
itertools.combinations | Перебрать все пары или наборы малого размера. | Линейного алгоритма на больших данных. |
functools.lru_cache | Запомнить результаты чистой рекурсивной функции. | Объяснения рекурсии, если кеш скрывает важное состояние. |
heapq | Многократно брать минимум или хранить top-k. | Полной сортировки, если нужен весь порядок один раз. |
bisect | Найти позицию в уже отсортированном списке. | Поиска в неотсортированных данных. |
heapq гарантирует минимум в позиции 0. Остальной список не отсортирован полностью: не обращайся с кучей как с готовым отсортированным массивом.
Если требуется только несколько максимальных значений, heapq.nlargest точно описывает задачу. Когда нужен полностью отсортированный результат, выбирай sorted.
import heapq
scores = [72, 91, 84, 68, 95, 88]
leaders = heapq.nlargest(3, scores)
print(leaders)Результат [95, 91, 88] содержит только нужную тройку. Исходный список при этом не изменяется.
Какой контейнер уместнее для многократного извлечения элементов с начала очереди?