61 votes

Python: Comment trier une liste de dictionnaires selon plusieurs valeurs?

Je veux trier une liste de au premier par une valeur, puis par une deuxième valeur. Est-il un moyen facile de faire cela? Voici un petit exemple:

A = [{'name':'john','age':45},
     {'name':'andi','age':23},
     {'name':'john','age':22},
     {'name':'paul','age':35},
     {'name':'john','age':21}]

Cette commande est pour trier cette liste en 'name':

sorted(A, key = lambda user: user['name'])

Mais comment je peux trier cette liste par une deuxième valeur? Comme 'age' dans cet exemple.

Je veux un tri comme ça (d'abord trier par 'name' , puis de trier par 'age'):

andi - 23
john - 21
john - 22
john - 45
paul - 35

Merci!

89voto

jamylak Points 38094
>>> A = [{'name':'john','age':45},
     {'name':'andi','age':23},
     {'name':'john','age':22},
     {'name':'paul','age':35},
     {'name':'john','age':21}]
>>> sorted(A, key = lambda user: (user['name'], user['age']))
[{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}]

Il trie par un tuple de deux attributs, ce qui suit est l'équivalent, et beaucoup plus rapide/nettoyeur:

>>> from operator import itemgetter
>>> sorted(A, key=itemgetter('name', 'age'))
[{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}]

À partir des commentaires: @Bakuriu

Je parie qu'il n'y a pas une grande différence entre les deux, mais itemgetter évite un peu de surcharge, car il extrait les clés et faire l' tuple au cours d'une seule opcode(CALL_FUNCTION), tout en appelant l' lambda aura pour appeler la fonction, charge les différentes constantes(qui sont les autres bytecode) enfin appeler l'indice (BINARY_SUBSCR), construire l' tuple et le retourner... c'est beaucoup plus de travail pour l'interprète.

Pour résumer: itemgetter garde l'exécution entièrement sur l' C de niveau, il est donc aussi vite que possible.

53voto

Jon Clements Points 51556
from operator import itemgetter

sorted(your_list, key=itemgetter('name', 'age'))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X