Como classificar uma lista de listas por um índice específico da lista interna?

Respostas:

321

Este é um trabalho para o 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']]

Também é possível usar uma função lambda aqui, no entanto, a função lambda é mais lenta nesse caso simples

John La Rooy
fonte
E se eu quiser ignorar o caso?
bzupnick
5
@bzupnick, use key=lambda x:x[2].casefold(). Se o seu Python não for novo o suficiente, use-o em .lower()vez de.casefold()
John La Rooy 29/07
x = [[[5,3], 1,0345], [[5,6], 5,098], [[5,4], 4,89], [[5,1], 5,97]] Com uma lista como essa, pode classificamos usando itemgetter () em relação aos elementos em x [0] [1]?
usar o seguinte comando
Também posso obter os índices da classificação, para classificar outra lista relacionada de listas na mesma ordem?
quarky
@ quaryk Parece uma pergunta interessante, mas não é adequada para responder nos comentários. Se você não encontrar uma pergunta que cubra, crie uma.
John La Rooy
175

no lugar

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

não está no lugar usando classificado:

>>> sorted(l, key=lambda x: x[2])
mouad
fonte
4
Você poderia dar mais detalhes sobre in placee not in place?
Qun
9
@qun, "no lugar" significa que a memória da lista antiga é reutilizada para a lista classificada. "não está no lugar" significa que a lista antiga permanece inalterada e uma nova lista é criada.
John La Rooy
x = [[[5,3], 1,0345], [[5,6], 5,098], [[5,4], 4,89], [[5,1], 5,97]] Com uma lista como esta, como podemos classificar em relação aos elementos em x [0] [1]?
usar o seguinte comando
81

O Itemgetter permite que você classifique por vários critérios / colunas:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
corredor
fonte
5
Eu acho que essa resposta é muito importante. Eu acho que as pessoas que tentam classificar por índices de matriz interna caem aqui, mas as pessoas que procuram classificar por vários índices de matriz interna começarão aqui e sua resposta me ajudou a ver que o itemgetter realmente fará isso por você!
9114 ZekeDroid
11

vários critérios também podem ser implementados através da função lambda

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

Você pode classificar facilmente usando esse trecho, onde 1 é o índice do elemento.

Abhishek Yadav
fonte
8

Como isso:

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

Eu acho que a função lambda pode resolver seu 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
fonte
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])**

corrija-me se estiver errado, mas o 'x [2]' não está chamando o terceiro item da lista, e não o terceiro item da lista aninhada? deveria ser x [2] [2]?

EgmontDeVos
fonte
Não, porque key / lambda já está iterando nos itens da lista de primeiro nível. x é uma variável local vinculada a cada item por vez.
DragonLord 6/06
1

Mais fácil de entender (o que o Lambda está realmente fazendo):

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
fonte
0

Classificando uma matriz multidimensional, execute aqui

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
fonte