Ordenando la lista 2D de python

Tengo el siguiente tipo de lista

[1, 0.23] [2, 0.39] [4, 0.31] [5, 0.27] 

Quiero ordenar esto en orden descendente de la segunda columna. Intenté la función ‘ordenada’ en python. Pero me da un objeto ‘TypeError’: ‘float’ es unsubscriptable. Por favor ayudame a resolver este problema.

Puedes usar un lambda:

 >>> li=[[1, 0.23], ... [2, 0.39], ... [4, 0.31], ... [5, 0.27]] >>> sorted(li,key=lambda l:l[1], reverse=True) [[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]] 

O al revés:

 >>> sorted(li,key=lambda l:l[1]) [[1, 0.23], [5, 0.27], [4, 0.31], [2, 0.39]] 

Para ordenar una lista de listas en la segunda columna, use operator.itemgetter() para mayor facilidad y claridad:

 from operator import itemgetter outputlist = sorted(inputlist, key=itemgetter(1), reverse=True) 

o, para ordenar en el lugar:

 from operator import itemgetter inputlist.sort(key=itemgetter(1), reverse=True) 

itemgetter() es un poco más rápido que usar un lambda para la tarea.

Manifestación:

 >>> from operator import itemgetter >>> inputlist = [ ... [1, 0.23], ... [2, 0.39], ... [4, 0.31], ... [5, 0.27], ... ] >>> sorted(inputlist, key=itemgetter(1), reverse=True) [[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]] 

Solo vería su excepción si tuviera valores de punto flotante en su lista de entrada directamente :

 >>> inputlist.append(4.2) >>> inputlist [[1, 0.23], [2, 0.39], [4, 0.31], [5, 0.27], 4.2] >>> sorted(inputlist, key=itemgetter(1), reverse=True) Traceback (most recent call last): File "", line 1, in  TypeError: 'float' object is not subscriptable 

(para Python 3; el mensaje de error de Python 2 es ligeramente diferente, lo que da como resultado TypeError: 'float' object has no attribute '__getitem__' lugar).

Esto se debe a que la itergetter(1) se aplica a todos los elementos en la lista externa, pero solo funciona en secuencias ordenadas anidadas, no en el valor de punto flotante que ahora se agrega.