2010-02-25 29 views
33

Me gustaría utilizar el método somelist.sort() para hacer esto si es posible.Clasificación Python - Una lista de objetos

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

¿Cómo puedo hacer esto?

Gracias!

Respuesta

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

Ésta es otra manera de hacer lo mismo que usted verá a menudo utilizado:

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

También puede ser que desee mirar a sorted si no lo ha visto ya. No modifica la lista original; devuelve una nueva lista ordenada.

+0

Respondió dos de mis preguntas (attrgetter ..) y me indicó algo útil. ¡Gracias! – Art

+0

¡Me ayudaste a darme cuenta de qué tan diferente es el género! Gracias – gl2748

10

Por supuesto, no tiene que ser una lambda. Cualquier función aprobada en, como el debajo de uno, 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: Python Sorting

Así, en su 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 mencionado es sin duda el más compacto forma de hacerlo, pero también está usando 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)] 

Así que usaría itemgetter ('resultType'). (. Suponiendo GetItem se define)

sorted(L, key=operator.itemgetter('resultType')) 
+1

cmp está en desuso, ni siquiera existe en Python3. Deberías usar una función clave en su lugar. –

+1

Gracias por esto.Siempre me gusta ver formas no lambda de hacer las cosas, incluso si finalmente utilizaré la versión lambda (se siente más sexy) – NickO

+0

Gracias Rizwan. el método de comparación fue útil –

1
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 se pasa de una función de comparación que se utiliza para par-sabia comparación de los elementos en 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 quitamos los valores clave de los pares. Esto es realmente útil si su función de comparación es costosa, pero es solo una pérdida de memoria si la comparación es realmente barata.

Es decir, la expansión de la llave de la versión se ve algo como esto:

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

Para una sencilla función clave, que es claramente demasiado trabajo, por lo que en lugar de eso se recomienda usar el encendedor tipo basado función.

Tenga en cuenta que el parámetro de función cmp debe devolver -1, 0, 1 en menos, igual o mayor que en los casos. Puede escribirlo usted mismo, pero también puede usar la función cmp incorporada, que es más clara.

+0

Suspiro, gracias @gnibbler, no sabía que el param cmp había quedado obsoleto en Python 3, eso es bueno saberlo. Pero si está en Python 2.x, creo que es más claro y más eficiente que la versión clave. En Python 3, seguiría a Mark Byers. –

Cuestiones relacionadas