Согласно документации heapq , способ настройки порядка кучи состоит в том, чтобы каждый элемент в куче был кортежем, а первый элемент кортежа, который принимает обычные сравнения Python.
Функции в модуле heapq немного громоздки (поскольку они не являются объектно-ориентированными) и всегда требуют, чтобы наш объект кучи (список в виде кучи) явно передавался в качестве первого параметра.Мы можем убить двух зайцев одним выстрелом, создав очень простой класс-обертку, который позволит нам указать функцию key
и представить кучу в виде объекта.
Класс ниже содержит внутренний список, гдекаждый элемент является кортежем, первый элемент которого является ключом, вычисляемым во время вставки элемента с использованием параметра key
, передаваемого в экземпляре Heap:
# -*- coding: utf-8 -*-
import heapq
class MyHeap(object):
def __init__(self, initial=None, key=lambda x:x):
self.key = key
if initial:
self._data = [(key(item), item) for item in initial]
heapq.heapify(self._data)
else:
self._data = []
def push(self, item):
heapq.heappush(self._data, (self.key(item), item))
def pop(self):
return heapq.heappop(self._data)[1]