2010-11-13 41 views
149

Tengo una lista de listas. Por ejemplo,¿Cómo ordenar una lista de listas por un índice específico de la lista interna?

[ 
[0,1,'f'], 
[4,2,'t'], 
[9,4,'afsd'] 
] 

Si quisiera ordenar la lista externa por el campo de cadena de las listas internas, ¿cómo hacer eso en Python?

+3

Enlace al tutorial: http://wiki.python.org/moin/HowTo/Sorting/ –

+3

vínculo útil: http://stackoverflow.com/questions/18142090/python-sort-a-list- of-lists-by-an-item-in-the-sublist –

Respuesta

212

Este es un trabajo para itemgetter

>>> from operator import itemgetter 
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
>>> sorted(L, key=itemgetter(2)) 
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']] 

También es posible utilizar una función lambda aquí, sin embargo, la función lambda es más lento en este caso sencillo

+0

¿Qué sucede si deseo ignorar el caso? – bzupnick

+5

@bzupnick, use 'key = lambda x: x [2] .casefold()'. Si su Python no es lo suficientemente nuevo, simplemente use '.lower()' en lugar de '.casefold()' –

+0

x = [[[5,3], 1.0345], [[5,6], 5.098], [ [5,4], 4.89], [[5,1], 5.97]] Con una lista como esta ¿podemos ordenar utilizando itemgetter() con respecto a los elementos en x [0] [1]? – nidHi

110

en su lugar

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
>>> l.sort(key=lambda x: x[2]) 

no en su lugar usando ordenado:

>>> sorted(l, key=lambda x: x[2]) 
+1

¿Podría dar más detalles sobre 'in place' y' not in place'? – qun

+4

@qun, "in place" significa que la memoria de la lista anterior se reutiliza para la ordenada. "no en su lugar" significa que la lista anterior permanece sin cambios y se crea una nueva lista. –

+0

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Con una lista como esta es , ¿cómo podemos ordenar con respecto a los elementos en x [0] [1]? – nidHi

6

De esta manera:

import operator 
l = [...] 
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index)) 
50

Itemgetter le permite ordenar por varios criterios/columnas:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1)) 
+2

Creo que esta respuesta es muy importante. Creo que las personas que intenten ordenar por índices de matriz interna caerán aquí, pero las personas que busquen clasificar por Índices de matriz interna MÚLTIPLES comenzarán aquí y su respuesta me ayudó a ver que el objeto en cuestión realmente lo hará por usted. – ZekeDroid

3

múltiples criterios también se puede implementar a través función lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0])) 
2

creo lambda la función puede resolver su problema.

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']] 

#let's assume we want to sort lists by last value (old_list[2]) 
new_list = sorted(old_list, key=lambda x: x[2]) 

#Resulst of new_list will be: 

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']] 
Cuestiones relacionadas