2012-07-28 10 views
10

se puede ordenar una serie de myclass utilizando el argumento key a la función sorted:Python: Clasificar clases personalizadas sin el uso del argumento `clave`?

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

¿Hay una manera de definir un orden natural para nuestra clase? ¿Tal vez algún método mágico para que no tengamos que pasar una clave cada vez?

por ejemplo,

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

    def __sortkey__(self): 
     return self.key2 

O será, naturalmente, trabajar si definimos __le__ tal vez?

Respuesta

3

lo haría por razones imperiosas de __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. ¡Bonito! No se pudo encontrar en http://docs.python.org/library/functions.html#sorted – mpen

+8

Tenga en cuenta que '__cmp__' no funciona en Python 3 – samfrances

13

Además de __cmp__, también puede hacerlo con los llamados "operadores de comparación ricos", __eq____le__, __lt__, __gt__ y __ge__. En lugar de definirlos todos, puede usar el decorador de clases functools.total_ordering en 2.7 +/3.1 +. __cmp__ se ha ido en 3.x.

+1

Aún mejor. '__le__' es más fácil de implementar ya que solo necesito devolver un bool. – mpen

Cuestiones relacionadas