Как выбрать топ N записей в Python через heapq.nlargest

Как выбрать топ N записей в Python через heapq.nlargest
Содержание статьи

Когда отчёту нужны три крупнейших заказа, передайте записи в heapq.nlargest() и укажите поле суммы через key. Функция вернёт сами записи в порядке убывания ключа. На Mentoring.digital покажем, как сохранить идентификатор заказа и получить определённый порядок при равных суммах.

Три заказа по сумме

Суммы в примере заданы целыми копейками. itemgetter читает ключ из словаря. Параметр n задаёт максимальное число записей в результате.

from heapq import nlargest
from operator import itemgetter

orders = [
    {"id": 11, "total": 8300},
    {"id": 12, "total": 12500},
    {"id": 13, "total": 4100},
    {"id": 14, "total": 9800},
]
top = nlargest(3, iter(orders), key=itemgetter("total"))
print([order["id"] for order in top])
# [12, 14, 11]

iter(orders) здесь показывает, что функции подходит итерируемый источник. Если данные приходят из генератора, он будет исчерпан после отбора. При повторном чтении создайте новый генератор.

Что сделать при равных суммах

Если в отчёте при равной сумме первым должен идти меньший числовой ID, задайте ключ lambda order: (order["total"], -order["id"]). Поскольку nlargest выбирает большие ключи, отрицательный ID задаёт нужный порядок для второй части пары. Проверьте правило двумя заказами с одинаковой суммой на границе топа.

Когда выбрать max или sorted

  • Для одного результата используйте max(orders, key=itemgetter("total"), default=None), если допустим пустой набор.
  • Для короткого топа удобно nlargest. Пустой источник возвращает пустой список. Если записей меньше запрошенного числа, функция вернёт все доступные.
  • Если нужен весь отсортированный список или почти все строки, рассмотрите sorted(). Скорость на своих данных проверяйте отдельно.

Задачу можно продолжить на практике по Python или попросить наставника по Python посмотреть, как отчёт обрабатывает равные суммы и пустую выборку.

Похожие статьи по данной теме