¿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


¿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])

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))

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]))

10
array.sort(key = lambda x:x[1])

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


8

Me gusta esto:

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

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']]

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]?


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)

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.