Comment trier une liste de listes selon un index spécifique de la liste intérieure?

Réponses:

321

Ceci est un travail pour 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']]

Il est également possible d'utiliser une fonction lambda ici, mais la fonction lambda est plus lente dans ce cas simple

John La Rooy
la source
Et si je voulais ignorer la casse?
bzupnick
5
@bzupnick, utilisez key=lambda x:x[2].casefold(). Si votre Python n'est pas assez nouveau, utilisez-le à la .lower()place de.casefold()
John La Rooy
x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Avec une liste comme celle-ci, on peut on trie en utilisant itemgetter () par rapport aux éléments de x [0] [1]?
nidHi
Puis-je également obtenir les index du tri, afin de trier une autre liste de listes associées dans le même ordre?
quarky
@quaryk Cela ressemble à une question intéressante, mais ne convient pas pour répondre dans les commentaires. Si vous ne trouvez pas une question qui la couvre, vous devez en créer une.
John La Rooy
175

en place

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

pas en place en utilisant trié:

>>> sorted(l, key=lambda x: x[2])
mouad
la source
4
Pourriez-vous donner plus de détails sur in placeet not in place?
Qun
9
@qun, "in place" signifie que la mémoire de l'ancienne liste est réutilisée pour celle triée. "pas en place" signifie que l'ancienne liste reste inchangée et qu'une nouvelle liste est créée.
John La Rooy du
x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] Avec une liste comme celle-ci, comment trier par rapport aux éléments de x [0] [1]?
nidHi
81

Itemgetter vous permet de trier selon plusieurs critères / colonnes:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
fider
la source
5
Je pense que cette réponse est très importante. Je pense que les gens qui essaient de trier par index de tableau interne tomberont ici, mais ceux qui cherchent à trier par MULTIPLE index de tableau interne commenceront ici et votre réponse m'a aidé à voir que itemgetter le fera réellement pour vous!
ZekeDroid
11

plusieurs critères peuvent également être mis en œuvre via la fonction lambda

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

Vous pouvez facilement trier à l'aide de cet extrait de code, où 1 est l'index de l'élément.

Abhishek Yadav
la source
8

Comme ça:

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

Je pense que la fonction lambda peut résoudre votre problème.

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
la source
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])**

corrigez-moi si je me trompe, mais le «x [2]» n'appelle-t-il pas le 3e élément de la liste, pas le 3e élément de la liste imbriquée? devrait-il être x [2] [2]?

EgmontDeVos
la source
Non, car la clé / lambda parcourt déjà les éléments de la liste de premier niveau. x est une variable locale liée à tour de rôle à chaque élément.
DragonLord
1

Plus facile à comprendre (que fait réellement 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
la source
0

Le tri d'un tableau multidimensionnel s'exécute ici

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
la source