2012-07-28 7 views
10

Sie können eine Reihe von myclass sortieren, indem das key Argument der sorted Funktion:Python: Sort benutzerdefinierte Klasse ohne Verwendung von `Schlüssel` Argument?

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

Gibt es eine Möglichkeit, eine natürliche Ordnung für unsere Klasse zu definieren? Vielleicht eine magische Methode, damit wir nicht jedes Mal einen Schlüssel eingeben müssen?

z.B.

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

    def __sortkey__(self): 
     return self.key2 

Oder wird es natürlich funktionieren, wenn wir __le__ vielleicht definieren?

Antwort

3

ich sie durch zwingende tun würde __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. Nett! Konnte es nicht finden unter http://docs.python.org/library/functions.html#sorted – mpen

+8

Beachten Sie, dass '__cmp__' funktioniert nicht in Python 3 – samfrances

13

Neben __cmp__, können Sie es auch mit den sogenannten "reichen Vergleichsoperatoren" __eq__, __le__, __lt__, __gt__ und __ge__. Anstatt sie alle zu definieren, können Sie den Klassenzeichner functools.total_ordering in 2.7 +/3.1 + verwenden. __cmp__ ist in 3.x verschwunden.

+1

Noch besser. '__le__' ist einfacher zu implementieren, da ich nur einen Bool zurückgeben muss. – mpen

Verwandte Themen