Come posso ordinare un dizionario per chiave?

Quale sarebbe un bel modo per passare da {2:3, 1:89, 4:5, 3:0} a {1:89, 2:3, 3:0, 4:5}?
Ho controllato alcuni post ma tutti usano l'operatore "sorted" che restituisce tuple.

Soluzione

I dizionari standard di Python non sono ordinati. Anche se si ordinassero le coppie (chiave, valore), non si sarebbe in grado di memorizzarle in un dict in modo da preservare l'ordinamento.

Il modo più semplice è usare OrderedDict, che ricorda l'ordine in cui gli elementi sono stati inseriti:

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)])

Non preoccupatevi del modo in cui viene stampato od; funzionerà come previsto:

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

Per gli utenti Python 3, si deve usare .items() invece di .iteritems():

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

I dizionari stessi non hanno elementi ordinati in quanto tali, se volete stamparli ecc. con un certo ordine, ecco alcuni esempi:

In Python 2.4 e superiori:

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

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

dà:

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

(Python inferiore a 2.4:)

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

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

Commentari (1)

Come altri hanno menzionato, i dizionari sono intrinsecamente non ordinati. Tuttavia, se il problema è semplicemente quello di visualizzare i dizionari in modo ordinato, puoi sovrascrivere il metodo __str__ in una sottoclasse di dizionario e usare questa classe di dizionari piuttosto che il dict costruito. Per esempio.

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}

Nota, questo non cambia nulla su come le chiavi sono memorizzate, l'ordine in cui tornano quando si itera su di esse, ecc, solo come vengono visualizzate con print o nella console di python.

Commentari (0)