2012-07-12 42 views
6

Tengo una lista de tuplas:Clasificación compleja con parámetros múltiples?

li = [('fink', 3), ('flip', 3), ('flock', 4), ('foo', 12), ('foot', 20), ('football', 20), ('futz', 10), ('flip', 3), ('flank', 3), ('flop', 3)] 

¿Cómo puedo ordenar la lista por número de descendientes en primer lugar y luego alfabéticamente descendente? Los resultados serían:

('foot', 20) 
('football', 20) 
('foo', 12) 
('futz', 10) 
('flock', 4) 
('fink', 3) 
('flip', 3) 
('flake', 3) 
('flop', 3) 

from operator import itemgetter 

sorted_li = sorted(li, key=itemgetter(1,0), reverse=True) 

Mientras que los anteriores tipos de códigos de descender número correctamente, las palabras no están ordenados alfabéticamente.

+0

posible duplicado de [Criterios de clasificación avanzados para una lista de tuplas anidadas] (http://stackoverflow.com/questions/3831449/advanced-sorting-criteria-for-a-list-of-nested-tuples) – eumiro

Respuesta

9

Esto es demasiado complicado para un solo itemgetter. lambda utilizar en su lugar:

sorted_li = sorted(li, key=lambda x: (-x[1], x[0])) 

Se trata de la misma velocidad que dos clases consecutivas utilizando itemgetter, pero es menos código y probablemente más fácil de leer.

+0

This funciona porque puede usar el hecho de que un elemento de clasificación es un número. ¿Qué pasa si ambos son cuerdas? –

+1

@JonClements Él usaría tu solución :) – jamylak

6

Como una especie de Python es estable, es más fácil de clasificar en dos ocasiones:

sorted_li = sorted(li, key=itemgetter(1), reverse=True) 
sorted_li.sort(key=itemgetter(0)) 
Cuestiones relacionadas