2010-10-24 25 views
40

que tiene una lista de instancias de clases -Ordenar una lista de instancias de clase Python

x = [<iteminstance1>,...] 

entre otros atributos de la clase tiene score atributo. ¿Cómo puedo ordenar los artículos en orden ascendente según este parámetro?

EDITAR: El list en Python tiene algo que se llama sort. ¿Podría usar esto aquí? ¿Cómo dirijo esta función para usar mi atributo score?

Respuesta

64
import operator 
sorted_x = sorted(x, key=operator.attrgetter('score')) 

si desea ordenar x en el lugar, también puede:

x.sort(key=operator.attrgetter('score')) 
+1

wow! es así de simple !! Acabo de revisarlo. Es :) –

+7

¡Bienvenido a Python! En aras de la completitud: el parámetro "clave" para activar funciones/métodos acepta una función como su parámetro. El módulo de operador proporciona funciones útiles para las tareas que normalmente realiza el lenguaje Sintaxis en sí misma, como una función "agregar" para hacer lo mismo que el token "+" en el idioma, y ​​en este caso el attrgetter para hacer lo mismo " . "conector hace en la sintaxis. Otros parámetros para "clave" pueden ser funciones in place definidas con "lambda". En este caso, sorted_x = sorted (x, lambda x: x.score)) - también habría funcionado. El ejemplo dado es mejor, sin embargo. – jsbueno

+1

No estoy seguro de que usar 'attrgetter' sea mejor. Lambdas parece ser igual de rápido y parece más limpio IMO. – adw

88

Además de la solución que recibieron, que podría también poner en práctica el método especial __lt__() ("menos") en la clase El método sort() (y la función sorted()) podrá comparar los objetos y, por lo tanto, ordenarlos. Sin embargo, esto funciona mejor cuando solo los ordena en este atributo.

class Foo(object): 

    def __init__(self, score): 
     self.score = score 

    def __lt__(self, other): 
     return self.score < other.score 

l = [Foo(3), Foo(1), Foo(2)] 
l.sort() 
+1

Esto es particularmente útil si no tiene acceso a la función ordenada. Esto sucede cuando otros módulos lo llaman ordenado, como los módulos de biblioteca estándar. Ejemplo - 'priorityqueue' en llamadas' queue' ordenadas para los artículos que usted suministra. –

+1

¿Qué pasa si tenemos instancias con 2 parámetros como Foo ['abc', 3] –

+1

@BimleshSharma Luego, escriba su método '__lt__' de acuerdo con la forma en que desea que sus instancias se comparen, p. 'return (self.text, self.num) <(other.text, other.num)'. – kindall

Cuestiones relacionadas