2011-07-12 8 views
25

si tengo una lista que contiene una lista que tiene este aspecto ...Python lista de ordenación de listas/ascendente y luego decending

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3] 

cómo puedo ordenarlos de manera que el elemento 0 se ordena descendente y el elemento 1 clasificado de forma ascendente por lo que el resultado será similar ...

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3] 

Usando itemgetter me puede pasar a la inversa en el elemento 0, pero entonces yo recurro contra elemento que, por supuesto, sino que arruina la clase anterior. No puedo hacer una combinación de teclas, ya que primero tiene que ordenar descendente y luego ascendente.

TIA, PK

Respuesta

32
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]] 
L.sort(key=lambda k: (k[0], -k[1]), reverse=True) 

L contiene ahora:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
+0

Lo aceptaré tan pronto como me permita. Esto es exactamente lo que necesitaba. Estoy trabajando en un problema de enrutamiento de ubicaciones/almacenes de contenedores para las listas de recogida en nuestro almacén, y este fue el truco. Si tiene tiempo, ¿podría explicar qué hace "lambda k: (k [0], - k [1])"? ¿El signo negativo significa lo contrario? ¿Pude haber obtenido el mismo resultado con lambda k: (-k [0], k [1]) sin el argumento inverso? – Ominus

+0

@Ominus: el '-k [1]' invierte el signo en el entero que invierte su orden de clasificación natural. No puede hacer '-k [0]' ya que ese valor es una cadena. Entonces, 'reverse = True' invierte el orden de clasificación y' -k [1] 'anula esa inversión en el segundo elemento. –

2

Algo como

def mycmp(a, b): 

    res = cmp(a[0], b[0]) 
    if res == 0: 
    return cmp(a[1], b[1]) 
    return res 

newlist = sorted(input_list, cmp=mycmp) 

El método de comparación comprueba primero el primer elemento de cada elemento. Si son iguales, comprobará los segundos elementos de cada elemento. El valor de retorno dentro de la implementación de mycmp() puede ser negado para implementar un comportamiento de clasificación diferente.

25

Usted puede hacer sucesivas rondas de clasificación como de sort pitón es stable. Sin embargo, primero debe ordenar la clave secundaria . Vea también el official HOW TO.

from operator import itemgetter 
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]] 
l.sort(key=itemgetter(1)) 
l.sort(key=itemgetter(0), reverse=True) 
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
Cuestiones relacionadas