2010-11-13 8 views
149

J'ai une liste de listes. Par exemple,Comment trier une liste de listes par un index spécifique de la liste interne?

[ 
[0,1,'f'], 
[4,2,'t'], 
[9,4,'afsd'] 
] 

Si je voulais trier la liste externe par le champ de chaîne des listes internes, comment feriez-vous en python?

+3

Lien vers tutoriel: http://wiki.python.org/moin/HowTo/Sorting/ –

+3

lien utile: http://stackoverflow.com/questions/18142090/python-sort-a-list- de-listes-par-un-article-dans-la-sous-liste –

Répondre

212

C'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 simple cas

+0

Et si je voulais ignorer le cas? – bzupnick

+5

@bzupnick, utilisez 'key = lambda x: x [2] .casefold()'. Si votre Python n'est pas assez récent, utilisez '.lower()' au lieu de '.casefold()' –

+0

x = [[[5,3], 1,0345], [[5,6], 5,098], [ [5,4], 4,89], [[5,1], 5,97]] Avec une telle liste, peut-on trier en utilisant itemgetter() par rapport aux éléments de x [0] [1]? – nidHi

110

en place

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

pas en place avec trié:

>>> sorted(l, key=lambda x: x[2]) 
+1

Pourriez-vous donner plus de détails sur «en place» et «pas en place»? – qun

+4

@qun, "en place" signifie que la mémoire de l'ancienne liste est réutilisée pour la liste triée. "pas en place" signifie que l'ancienne liste reste inchangée et qu'une nouvelle liste est créée. –

+0

x = [[[5,3], 1,0345], [[5,6], 5,098], [[5,4], 4,89], [[5,1], 5,97]] Avec une liste comme celle-ci est , comment pouvons-nous trier par rapport aux éléments dans x [0] [1]? – nidHi

6

Comme ceci:

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

Itemgetter vous permet de trier par de multiples critères/colonnes:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1)) 
+2

Je pense que cette réponse est très importante. Je pense que les gens qui essaient de trier par index de tableaux internes tomberont ici mais les gens qui cherchent à trier par MULTIPLES index de tableaux internes commenceront ici et votre réponse m'a aidé à voir que cet itemgetter le fera vraiment pour vous! – ZekeDroid

3

critères multiples peuvent également être mis en œuvre grâce à la fonction lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0])) 
2

Je pense lambda La fonction 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']] 
Questions connexes