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


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

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

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

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.


8

Comme ça:

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

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

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


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)

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.