Comment trier un dictionnaire par clé ?

Quelle serait la meilleure façon de passer de {2:3, 1:89, 4:5, 3:0} à {1:89, 2:3, 3:0, 4:5} ?
J'ai vérifié quelques posts mais ils utilisent tous l'opérateur "sorted&quot ; qui retourne des tuples.

Solution

Les dictionnaires Python standard ne sont pas ordonnés. Même si vous triiez les paires (clé,valeur), vous ne pourriez pas les stocker dans un dict d'une manière qui préserverait l'ordre.

Le moyen le plus simple est d'utiliser [OrderedDict][1], qui se souvient de l'ordre dans lequel les éléments ont été insérés :

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

Ne vous souciez pas de la façon dont od est imprimé, cela fonctionnera comme prévu :

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Pour les utilisateurs de Python 3, il faut utiliser le .items() au lieu de .iteritems() :

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5

[1] : http://docs.python.org/library/collections.html#collections.OrderedDict

Commentaires (14)

Les dictionnaires eux-mêmes ne comportent pas d'éléments ordonnés en tant que tels, mais si vous souhaitez les imprimer dans un certain ordre, voici quelques exemples :

En Python 2.4 et supérieur :

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

donne :

alan: 2
bob: 1
carl: 40
danny: 3

(Python inférieur à 2.4 :).

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

Source : [http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/][1]

[1] : http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/

Commentaires (1)

Comme d'autres l'ont mentionné, les dictionnaires sont par nature non ordonnés. Cependant, si le problème est simplement de afficher les dictionnaires de manière ordonnée, vous pouvez surcharger la méthode __str__ dans une sous-classe de dictionnaire, et utiliser cette classe de dictionnaire plutôt que le dict intégré. Par exemple.

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"

>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

Notez que cela ne change rien à la façon dont les clés sont stockées, à l'ordre dans lequel elles reviendront lorsque vous itérerez sur elles, etc., mais seulement à la façon dont elles seront affichées avec print ou sur la console python.

Commentaires (0)