In base allo heapq documentation, il modo in cui personalizzare l'ordine dell'heap consiste nell'assegnare ad ogni elemento dell'heap una tupla, con il primo elemento tuple che accetta normali confronti Python.
Le funzioni nel modulo heapq sono un po 'macchinose (poiché non sono orientate agli oggetti) e richiedono sempre che il nostro oggetto heap (un elenco heapificato) venga passato esplicitamente come primo parametro. Possiamo uccidere due piccioni con una fava creando una classe wrapper molto semplice che ci consentirà di specificare una funzione key
e di presentare l'heap come un oggetto.
La classe sotto mantiene un elenco interno, in cui ogni elemento è una tupla, il primo elemento del quale è una chiave, calcolata al momento dell'inserimento dell'elemento utilizzando il parametro key
, passato al mucchio esemplificazione:
# -*- 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]
possibile duplicato di http://stackoverflow.com/questions/679731/min-heap-in-python –
possibile duplicato di [Come rendere heapq valutare l'heap di un attributo specifico?] (Http: // stackoverflow .com/questions/3954530/how-to-make-heapq-valutare-l'-heap-di-un-specifico-attributo) –