Python 3.7+ ou CPython 3.6
Les Dicts préservent l'ordre d'insertion dans Python 3.7+. Idem dans CPython 3.6, mais c'est un détail de mise en œuvre .
>>> x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}
ou
>>> dict(sorted(x.items(), key=lambda item: item[1]))
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}
Python plus ancien
Il n'est pas possible de trier un dictionnaire, mais seulement d'obtenir une représentation d'un dictionnaire trié. Les dictionnaires sont par nature sans ordre, mais d'autres types, tels que les listes et les tuples, ne le sont pas. Vous avez donc besoin d'un type de données ordonné pour représenter les valeurs triées, 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.items(), key=operator.itemgetter(1))
sorted_x
sera une liste de tuples triés par le deuxième élément de chaque tuple. dict(sorted_x) == x
.
Et pour ceux qui souhaitent trier sur les clés au lieu des valeurs :
import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))
Dans Python3, depuis le déballage n'est pas autorisé nous pouvons utiliser
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])
Si vous voulez la sortie comme un dict, vous pouvez utiliser collections.OrderedDict
:
import collections
sorted_dict = collections.OrderedDict(sorted_x)
9 votes
La structure de données du dictionnaire n'a pas d'ordre inhérent. Vous pouvez l'itérer, mais rien ne garantit que l'itération suivra un ordre particulier. C'est par conception, donc votre meilleure chance est probablement d'utiliser une autre structure de données pour la représentation.
135 votes
"sorted()" peut opérer sur des dictionnaires (et retourne une liste de clés triées), donc je pense qu'il est conscient de cela. Sans connaître son programme, il est absurde de dire à quelqu'un qu'il utilise la mauvaise structure de données. Si les recherches rapides sont ce dont vous avez besoin 90% du temps, alors un dict est probablement ce que vous voulez.
0 votes
Les trois sorties (clés, valeurs, les deux) pour le tri des dictionnaires sont couvertes ici dans un style clair et concis : stackoverflow.com/questions/16772071/sort-dict-by-value-python
2 votes
@Daishiman La classe de base peut ne pas être ordonnée mais OrderedDict est bien sûr.
1 votes
Dans Python 3.6+, les dictionnaires préservent l'ordre d'insertion. Bien entendu, cela n'équivaut pas à la possibilité de les trier par valeur, mais d'un autre côté, il n'est plus valable de dire que "la structure de données des dictionnaires n'a pas d'ordre inhérent".