Question Comment trier une liste de dictionnaires par valeurs du dictionnaire en Python?


J'ai obtenu une liste de dictionnaires et je veux que cela soit trié par une valeur de ce dictionnaire.

Ce

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

trié par nom, devrait devenir

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

1340
2017-09-16 14:39


origine


Réponses:


Il peut sembler plus propre en utilisant une clé à la place d'un cmp:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 

ou comme l'ont suggéré J. F. Sebastian et d'autres,

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

Pour l'exhaustivité (comme indiqué dans les commentaires par fitzgeraldsteele), ajouter reverse=True trier par ordre décroissant

newlist = sorted(l, key=itemgetter('name'), reverse=True)

1818
2017-09-16 15:18



import operator

Pour trier la liste des dictionnaires par clé = 'nom':

list_of_dicts.sort(key=operator.itemgetter('name'))

Pour trier la liste des dictionnaires par clé = 'age':

list_of_dicts.sort(key=operator.itemgetter('age'))

109
2017-09-16 14:39



Si vous souhaitez trier la liste par plusieurs clés, vous pouvez effectuer les opérations suivantes:

my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

Il est plutôt hackish, puisqu'il repose sur la conversion des valeurs en une seule représentation de chaîne, mais cela fonctionne comme prévu pour les nombres incluant les négatifs (bien que vous ayez besoin de formater correctement votre chaîne avec zéro paddings si vous utilisez des nombres)


39
2017-09-16 14:43



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

my_list.sort(lambda x,y : cmp(x['name'], y['name']))

my_list sera maintenant ce que vous voulez.

(3 ans plus tard) Edité pour ajouter:

Le nouveau key l'argument est plus efficace et plus propre. Une meilleure réponse ressemble maintenant à:

my_list = sorted(my_list, key=lambda k: k['name'])

... le lambda est, OMI, plus facile à comprendre que operator.itemgetter, mais YMMV.


27
2017-09-16 14:36



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 pour l'attribut 'name' de chaque élément.


20
2017-09-16 14:52



Je suppose que tu as voulu dire:

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

Cela serait trié comme ceci:

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

14
2017-09-16 14:31



Vous pouvez utiliser une fonction de comparaison personnalisée ou transmettre 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 seule fois par article, 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 objets d'objets arbitraires: itemgetter. Alors essayez ceci:

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

12