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


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

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

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

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

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


8

Como isso:

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

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

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


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)

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.