3423 votes

Trier un dictionnaire Python en valeur

J'ai un dictionnaire de valeurs lues à partir de deux champs dans une base de données: une chaîne de caractères et un champ numérique. Le champ de chaîne est unique, de sorte que c'est la clé du dictionnaire.

Je peux trier sur les touches, mais comment puis-je trier sur la base des valeurs?

Remarque: j'ai lu un Débordement de Pile question Comment puis-je trier une liste de dictionnaires par les valeurs du dictionnaire en Python? et probablement pu modifier mon code pour avoir une liste de dictionnaires, mais comme je n'ai pas vraiment besoin d'une liste de dictionnaires, je voulais savoir si il y a une solution plus simple.

4636voto

Devin Jeanpierre Points 23162

Il n'est pas possible de trier une dict, seulement pour obtenir une représentation d'un dict, qui est triée. Dicts sont intrinsèquement sans ordre, mais d'autres types, comme les listes et les tuples, ne le sont pas. Si vous avez besoin d'un triées de la représentation, qui sera une liste-probablement une liste de tuples.

Par exemple,

import operator
x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))

sorted_x sera une liste de tuples triés par le deuxième élément dans chaque tuple. dict(sorted_x) == x.

1197voto

Nas Banov Points 7293

Aussi simple que: sorted(dict1, key=dict1.get)

Eh bien, il est effectivement possible de faire un "tri par dictionnaire valeurs". Récemment, j'ai eu à le faire dans un Code de Golf (Débordement de Pile question Code de golf: Word tableau de fréquence). Abrégée, le problème était du genre: étant donné un texte, de compter combien de fois chaque mot se rencontre et affichage de la liste de mots, classés par ordre de fréquence décroissante.

Si vous construisez un dictionnaire avec les mots-clés et le nombre d'occurences de chaque mot en valeur, simplifié ici

d = defaultdict(int)
for w in text.split():
  d[w] += 1

ensuite, vous pouvez obtenir la liste des mots dans l'ordre de fréquence d'utilisation avec sorted(d, key=d.get) - le genre parcourt le dictionnaire touches, à l'aide comme une sorte de clé, le nombre de mot occurrences.

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

Je suis en train d'écrire cette explication détaillée pour illustrer ce que font souvent les gens dire par "je peux facilement trier un dictionnaire par la clé, mais comment puis-je trier par valeur" - et je pense que l'OP a été d'essayer de régler ce problème. Et la solution est de faire le tri de la liste des clés, sur la base des valeurs, comme indiqué ci-dessus.

804voto

Mark Points 1621

Vous pouvez utiliser:

sorted(d.items(), key=lambda x: x[1])

Cela permettra de trier le dictionnaire par les valeurs de chaque entrée dans le dictionnaire de la plus petite à la plus grande.

220voto

Roberto Bonvallet Points 6336

Dicts ne peuvent pas être triés, mais vous pouvez construire liste triée d'eux.

Une liste triée des dict valeurs:

sorted(d.values())

Une liste des (clé, valeur) paires, triés par valeur:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))

159voto

mykhal Points 5873

Au cours des dernières Python 2.7, nous avons la nouvelle OrderedDict type, qui se souvient de l'ordre dans lequel les éléments ont été ajoutés.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

Pour faire une nouvelle commandé dictionnaire de l'original, le tri par les valeurs:

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

Le OrderedDict se comporte comme un normal dict:

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])

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: