2011-05-20 15 views
5

tengo una lista de listas en el siguiente formato:¿Cómo ordenar una lista marcando los valores en una sublista en python?

[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]]] 

me gustaría ordenar si de una manera eficiente en Python utilizando los elementos de la lista numéricos, coincidiendo con el primer elemento, y cuando es la misma, usa el segundo, y así sucesivamente. El resultado sería algo así como (necesito para revertir esta vez):

['a',[10]] 
['c',[5,10]] 
['e',[5,1,-1]] 
['d',[5,1,-10] 
['b',[1]] 

Gracias!

+1

Esto no tiene nada que ver con la recursividad, entonces eliminaré la etiqueta –

Respuesta

5

Creo que las listas se comparan como usted quiere, por defecto, si invertida:

>>> data = [['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]] 
>>> sorted(data, reverse = True, key = lambda pair: pair[1]) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 

que usted tenía un error entre paréntesis en su lista de entrada, que está fijado en el código de seguridad.

+0

+1, golpeada lo. Tenga en cuenta que '' sorted() '' devuelve una nueva lista; si desea modificar la lista existente in-place use su método '' sort() '' que toma los mismos argumentos, es decir, '' data.sort (reverse = True, clave = par lambda: pair [1]) '' . – Blair

+0

¡Ja! Es bueno saber que sucede de manera predeterminada. Estaba tratando de descubrir cómo hacerlo en mi propio :) –

0

Uso key para seleccionar el segundo elemento de la lista, y reverse para cambiar de dirección:

>>> l=[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10], ['e',[5,1,-1]]] 
>>> sorted(l, key=lambda e:e[1], reverse=True) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 

listas se ordenan mediante la comparación de sus elementos en orden, al igual que un léxico o diccionario tradicional. Se llama 'comparación lexográfica'.

1
>>> from operator import itemgetter 
>>> L=[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]]] 
>>> sorted(L, key=itemgetter(1), reverse=True) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 
>>> 

que haría uso de itemgetter (1) aquí, que es más o menos equivalente a la función lambda en las otras respuestas. Esto efectivamente hace el tipo con la clave siendo las sublistas ya que son el número de artículo 1. (número de artículo 0 es las letras ae)

Cuestiones relacionadas