¿Cómo ordenar una lista de listas por un índice específico de la lista interna?

Respuestas:

321

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 usar una función lambda aquí, sin embargo, la función lambda es más lenta en este caso simple

John La Rooy
fuente
¿Qué pasa si quisiera ignorar el caso?
bzupnick
55
@bzupnick, uso key=lambda x:x[2].casefold(). Si su Python no es lo suficientemente nuevo, simplemente use en .lower()lugar de.casefold()
John La Rooy
x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Con una lista como esta se puede Clasificamos usando itemgetter () con respecto a los elementos en x [0] [1]?
nidHi
¿Puedo obtener también los índices del tipo, para ordenar otra lista de listas relacionadas en el mismo orden?
Quarky
@quaryk Parece una pregunta interesante, pero no es adecuada para responder en los comentarios. Si no puede encontrar una pregunta que la cubra, debe crear una.
John La Rooy el
175

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])
mouad
fuente
44
¿Podría dar más detalles sobre in placey not in place?
qun
99
@qun, "en el lugar" 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.
John La Rooy
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
81

Itemgetter le permite ordenar por múltiples criterios / columnas:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
fider
fuente
55
Creo que esta respuesta es muy importante. Creo que las personas que intentan ordenar por índices de matriz interna caerán aquí, pero las personas que buscan ordenar por ÍNDICES de matriz interna MÚLTIPLES comenzarán aquí y su respuesta me ayudó a ver que ¡itemgetter realmente hará eso por usted!
ZekeDroid
11

múltiples criterios también se pueden implementar a través de la función lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))
Rahul Kumar
fuente
10
array.sort(key = lambda x:x[1])

Puede ordenar fácilmente con este fragmento, donde 1 es el índice del elemento.

Abhishek Yadav
fuente
8

Me gusta esto:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))
Jim Brissom
fuente
8

Creo que la función lambda 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']]
Tushar Niras
fuente
2
**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])**

corrígeme si estoy equivocado pero ¿no es la 'x [2]' que llama al tercer elemento de la lista, no al tercer elemento de la lista anidada? debería ser x [2] [2]?

EgmontDeVos
fuente
No, porque key / lambda ya está iterando sobre los elementos en la lista de primer nivel. x es una variable local vinculada a cada elemento a su vez.
DragonLord
1

Más fácil de entender (¿Qué está haciendo realmente Lambda?):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)
Maz1978
fuente
0

Ordenar una matriz multidimensional ejecutar aquí

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
Nishan
fuente