2012-07-28 18 views
10

è possibile ordinare una vasta gamma di myclass utilizzando l'argomento key alla funzione sorted:Python: ordina la classe personalizzata senza utilizzare l'argomento `key`?

sortedlist = sorted(myclasses, key=lambda obj: obj.myproperty) 

C'è un modo per definire un ordinamento naturale per la nostra classe? Forse un metodo magico in modo che non dobbiamo passare ogni volta una chiave?

esempio,

class myclass: 
    def __init__(self,a,b): 
     self.key1 = a 
     self.key2 = b 

    def __sortkey__(self): 
     return self.key2 

O sarà naturalmente funzionerà se definiamo __le__ forse?

risposta

3

lo farei ridefinendo __cmp__

class myclass: 
    def __init__(self,a,b): 
     self.key1 = a 
     self.key2 = b 

    def __cmp__(self, other): 
     return cmp(self.key2, other.key2) 
+0

Ah. Bello! Impossibile trovarlo sotto http://docs.python.org/library/functions.html#sorted – mpen

+8

Nota che '__cmp__' non funziona in Python 3 – samfrances

13

Oltre a __cmp__, è anche possibile farlo con i cosiddetti "operatori di confronto ricchi" __eq__, __le__, __lt__, __gt__ e __ge__. Piuttosto che definirli tutti, puoi usare il decoratore della classe in 2.7 +/3.1 +. __cmp__ è andato in 3.x.

+1

Ancora meglio. '__le__' è più facile da implementare in quanto ho solo bisogno di restituire un bool. – mpen

Problemi correlati