Question Comment puis-je trier un dictionnaire par clé?


Quel serait un bon moyen d'aller de {2:3, 1:89, 4:5, 3:0} à {1:89, 2:3, 3:0, 4:5}?
J'ai vérifié certains posts mais ils utilisent tous l'opérateur "trié" qui retourne des tuples.


624
2018-01-25 10:54


origine


Réponses:


Les dictionnaires Python standard ne sont pas ordonnés. Même si vous avez trié les paires (clé, valeur), vous ne pourrez pas les stocker dans un dict d'une manière qui permettrait de préserver la commande.

Le moyen le plus simple est d'utiliser OrderedDict, qui rappelle 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)])

Peu importe le chemin od est imprimé; ça marchera 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

703
2018-01-25 10:56



Les dictionnaires eux-mêmes n'ont pas d'articles commandés en tant que tels, si vous voulez les imprimer, etc. dans un certain ordre, voici quelques exemples:

En Python 2.4 et plus:

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 ci-dessous 2.4 :)

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

La source: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/


344
2017-12-21 13:01



De Python collections documentation de la bibliothèque:

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

168
2018-03-02 21:04



Il existe un certain nombre de modules Python qui fournissent des implémentations de dictionnaire qui gèrent automatiquement les clés dans un ordre trié. Prendre en compte triedcontainers module qui est pure-Python et rapide-comme-C mises en œuvre. Il y a aussi comparaison de performance avec d'autres options populaires comparées les unes aux autres.

L'utilisation d'une dictée ordonnée est une solution inadéquate si vous devez constamment ajouter et supprimer des paires clé / valeur tout en répétant.

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

Le type SortedDict prend également en charge les recherches d'emplacement indexées et la suppression, ce qui n'est pas possible avec le type dict intégré.

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])

31
2018-03-28 16:27



Simplement:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

Sortie:

1 89
2 3
3 0
4 5

24
2017-11-12 21:28



Comme d'autres l'ont mentionné, les dictionnaires sont intrinsèquement non ordonnés. Cependant, si le problème est simplement affichage dictionnaires d'une manière ordonnée, vous pouvez remplacer le __str__ méthode dans une sous-classe de dictionnaire, et utiliser cette classe de dictionnaire plutôt que le dict. 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 les itérez, etc., à la façon dont elles sont affichées avec print ou à la console python.


21
2018-01-25 12:16



La manière la plus concise qui n'est mentionnée dans aucune des autres réponses est probablement celle-ci:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}

21
2017-10-30 14:33



Trouvé une autre façon:

import json
print json.dumps(d, sort_keys = True)

upd:
1. cela trie aussi les objets imbriqués (merci @DanielF).
2. Les dictionnaires python ne sont pas ordonnés, donc ils sont sutables pour print ou assignés à str uniquement.


13
2018-03-12 21:43



En Python 3.

>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
    print (key, D1[key])

donne

1 89
2 3
3 0
4 5

12
2017-12-17 02:22



Ici, j'ai trouvé une solution plus simple pour trier le dict python par clé en utilisant pprint. par exemple.

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}

mais en utilisant pprint, il reviendra dicté trié

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}

8
2018-02-03 11:11