Desidero tenere un mucchio di oggetti, non solo numeri. Avranno in loro un attributo intero che l'heap può ordinare. Il modo più semplice per usare gli heap in python è heapq, ma come faccio a ordinarlo per ordinare un attributo specifico quando si usa heapq?Come rendere heapq valutare l'heap di un attributo specifico?
risposta
heapq
sorta oggetti allo stesso modo list.sort
fa, quindi basta definire un metodo __cmp__()
all'interno della definizione di classe, che si metterà a confronto a un'altra istanza della stessa classe:
def __cmp__(self, other):
return cmp(self.intAttribute, other.intAttribute)
Lavori in Python 2.x.
In uso 3.x:
def __lt__(self, other):
return self.intAttribute < other.intAttribute
Sfortunatamente, non è possibile, anche se questa è una caratteristica spesso richiesta.
Un'opzione consisterebbe nell'inserire tuple (chiave, valore) nell'heap. Tuttavia, ciò non funzionerà se i valori generano un'eccezione quando confrontati (saranno confrontati nel caso di un legame tra le chiavi).
Una seconda opzione sarebbe quella di definire un metodo __lt__
(minore di) nella classe che utilizzerà l'attributo appropriato per confrontare gli elementi per l'ordinamento. Tuttavia, ciò potrebbe non essere possibile se gli oggetti sono stati creati da un altro pacchetto o se è necessario confrontarli in modo diverso altrove nel programma.
Una terza opzione consiste nell'utilizzare la classe sortedlist dal modulo blist (dichiarazione di non responsabilità: sono l'autore). Il costruttore per accetta un parametro key
che consente di specificare una funzione per restituire la chiave di ordinamento di un elemento, simile al parametro key
di list.sort
e sorted
.
Ho rimosso il mio commento precedente poiché il mio problema con 'blist' era probabilmente un PEBCAK (ancora grazie per il modulo), quindi duplo solo la prima parte del commento precedente: è sempre possibile definire una classe con un' __lt__ 'tramite sottoclasse o tramite incapsulamento. – tzot
Secondo l'esempio dal documentation, è possibile utilizzare tuple, e sarà ordinare dal primo elemento della tupla:
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
Così se non si desidera (o non si può?) fare un metodo __cmp__
, è possibile estrarre manualmente la chiave di ordinamento all'ora push.
Si noti che se i primi elementi in una coppia di tuple sono uguali, verranno confrontati ulteriori elementi. Se questo non è ciò che desideri, devi assicurarti che ogni primo elemento sia unico.
- 1. valutare attributo MethodExpression è impostato (ottenendo PropertyNotFoundException)
- 2. Modificare il valore di un attributo specifico
- 3. Come rendere GCC valutare le funzioni in fase di compilazione?
- 4. Come impostare un attributo face localmente per un buffer specifico?
- 5. Come valutare un System.Linq.Expressions.Expression
- 6. heapq con predicato confronto personalizzato
- 7. CSS3 ritardo di transizione di attributo specifico
- 8. selettore jQuery con attributo specifico
- 9. Posso rendere un attributo Moose "write once"?
- 10. Magento - Recupera prodotti con un valore di attributo specifico
- 11. come rendere un attributo unico nello schema xml?
- 12. Verificare l'esistenza di un valore attributo dati specifico
- 13. jQuery analisi XML: ottenere un elemento con un attributo specifico
- 14. Come valutare un motore di ricerca?
- 15. Come verificare se l'elemento contiene attributo di classe specifico
- 16. jQuery - Looping attraverso elementi con specifico attributo
- 17. Come rendere metodo di riferimento nel parametro attributo
- 18. Come faccio a rendere alcuni attributi accessibili solo agli utenti che hanno un ruolo specifico?
- 19. XPATH - Seleziona tutti i nodi figlio con un attributo specifico
- 20. Come verificare che esista un testo specifico all'interno di un attributo in Selenium IDE
- 21. rendere il codice css specifico per IE10
- 22. Symfony DomCrawler: Trova elemento con specifico valore di attributo
- 23. javascript defineProperty per rendere un attributo non enumerabile
- 24. Come rendere il valore di invio di un attributo tramite la funzione SQL
- 25. Come ottenere elementi XML specifici con un valore di attributo specifico?
- 26. Come posso contare gli elementi in una matrice che hanno un valore di attributo specifico?
- 27. Come rendere attributo .NET valido solo su alcuni tipi
- 28. bash: come valutare PS1, PS2, ...?
- 29. Come valutare le prestazioni CUDA?
- 30. PowerShell: come valutare una stringa di leggere da un file
'__cmp__' è andato in 3.x. Usa invece '__lt__'. –
'__lt__' funziona anche in Python 2, quindi è meglio evitare del tutto' __cmp__'. –
Proprio come si può dire qualsiasi ordinamento in base a un criterio diverso dall'ordinamento naturale dell'oggetto (ad esempio 'cmp' e' chiave' per 'sort'), si dovrebbe essere in grado di dire' heapq' per ordinare in base a un chiave diversa. In altre parole, non è necessario * ridefinire l'oggetto stesso * per modificare una particolare struttura di dati che la trattiene; dovresti essere in grado di dire solo la struttura dati stessa. Questo è un pezzo fondamentale notevole mancante dall'API 'heapq'. –