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.