Clasificación de Python – Una lista de objetos

Me gustaría usar el método somelist.sort () para hacer esto si es posible.

Tengo una lista que contiene objetos, todos los objetos tienen una variable miembro tipo de resultado que es un número entero. Me gustaría ordenar la lista usando este número.

¿Cómo hago esto?

¡Gracias!

somelist.sort(key = lambda x: x.resultType) 

Aquí hay otra forma de hacer lo mismo que a menudo verá:

 import operator s.sort(key = operator.attrgetter('resultType')) 

También es posible que desee ver sorted si aún no lo ha visto. No modifica la lista original, devuelve una nueva lista ordenada.

Por supuesto, no tiene que ser una lambda. Cualquier función pasada, como la de abajo, funcionará

 def numeric_compare(x, y): if x > y: return 1 elif x == y: return 0 else: #x < y return -1 a = [5, 2, 3, 1, 4] a.sort(numeric_compare) 

Fuente: Clasificación de Python

Entonces, en tu caso ...

 def object_compare(x, y): if x.resultType > y.resultType: return 1 elif x.resultType == y.resultType: return 0 else: #x.resultType < y.resultType return -1 a.sort(object_compare) 

La lambda antes mencionada es definitivamente la forma más compacta de hacerlo, pero también está utilizando operator.itemgetter .

 import operator #L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)] map(operator.itemgetter(0), L) #['c', 'd', 'a', 'b'] map(operator.itemgetter(1), L) #[2, 1, 4, 3] sorted(L, key=operator.itemgetter(1)) #[('d', 1), ('c', 2), ('b', 3), ('a', 4)] 

Entonces usarías itemgetter ('resultType'). (Suponiendo que getitem está definido.)

 sorted(L, key=operator.itemgetter('resultType')) 
 somelist.sort(cmp = lambda x, y: cmp(x.resultType, y.resultType)) 

Es mejor que:

 somelist.sort(key = lambda x: x.resultType) 

En el primer caso, pasamos a una función de comparación que se utiliza para comparar por pares los elementos de la lista. En el segundo caso, asignamos una nueva lista de pares del resultado de la función clave y el valor original. Luego ordenamos esa lista, luego eliminamos los valores clave de los pares. Esto es realmente útil si su función de comparación es costosa, pero es solo un desperdicio de memoria si la comparación es realmente barata.

Es decir, la expansión de la versión clave se ve así:

 l = [y for x,y in sorted(zip([key(i) for i in l], l))] 

Para una función de tecla simple, eso es claramente una sobrecarga, por lo que sugeriría usar el tipo basado en una función más ligera.

Tenga en cuenta que el parámetro de la función cmp debe devolver -1, 0, 1 en los casos menor que, igual y mayor que. Podría escribir eso usted mismo, pero también puede usar la función cmp incorporada que es más clara.