2640 votes

Comment trier une liste de dictionnaires par une valeur du dictionnaire ?

Comment trier une liste de dictionnaires par la valeur d'une clé spécifique ? Étant donné :

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Lorsqu'ils sont triés par name il devrait devenir :

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]

6 votes

Lire la réponse et continuer à regarder opérateur.itemgetter . Puis-je trier sur plusieurs valeurs dans le même processus (par exemple nous avons [{'name':'Bart', 'age':10, 'note':3},{'name':'Homer','age':10,'note':2},{'name':'Vasile‌​','age':20,'note':3}‌​] Et à utiliser : from operator import itemgetter newlist = sorted(old_list, key=itemgetter(-'note','name') EDIT : Testé, et ça marche mais je ne sais pas comment faire pour que la note soit DESC et le nom ASC.

40voto

efotinis Points 6338
import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

key" est utilisé pour trier par une valeur arbitraire et "itemgetter" définit cette valeur dans l'attribut "name" de chaque élément.

31voto

Je suppose que tu voulais dire :

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Cela serait trié comme suit :

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

27voto

Owen Points 321

Vous pourriez utiliser une fonction de comparaison personnalisée, ou vous pourriez passer dans une fonction qui calcule une clé de tri personnalisée. C'est généralement plus efficace, car la clé n'est calculée qu'une fois par élément, alors que la fonction de comparaison serait appelée plusieurs fois.

Vous pourriez le faire de cette façon :

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

Mais la bibliothèque standard contient une routine générique pour obtenir des éléments d'objets arbitraires : itemgetter . Essayez plutôt ceci :

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

27voto

antitrust Points 4853

Utilisation de la Transformation schwartzienne de Perl,

py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

faire

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

donne

>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

Plus d'informations sur la transformation Schwartzienne en Perl :

En informatique, la transformée de Schwartz est un programme de programmation Perl Perl utilisé pour améliorer l'efficacité du tri d'une liste d'éléments. Ce idiome est approprié pour le tri basé sur la comparaison lorsque l'ordre est est en fait basé sur l'ordre d'une certaine propriété (la clé) des éléments éléments, où le calcul de cette propriété est une opération intensive qui doit être qui doit être effectuée un nombre minimal de fois. La transformation de Schwartz est remarquable en ce qu'elle n'utilise pas de tableaux temporaires nommés.

10 votes

Python a soutenu le key= para .sort depuis 2.4, c'est-à-dire l'année 2004, il effectue la transformation de Schwartz dans le code de tri, en C ; cette méthode n'est donc utile que sur les Python 2.0-2.3. qui ont tous plus de 12 ans.

23voto

Matej Points 2427

Vous devez implémenter votre propre fonction de comparaison qui comparera les dictionnaires par les valeurs des clés de nom. Voir Triage Mini-HOW TO de PythonInfo Wiki

2 votes

Cela repose trop sur le lien. Pouvez-vous fournir une réponse plus complète ?

0 votes

Les réponses appropriées sont déjà fournies par d'autres contributeurs. N'hésitez pas à conserver le lien ou à supprimer la réponse.

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