Python: come ordinare un dizionario [dict] per chiave o per valore

In Python, i dizionari (dict) sono una struttura dati associativa che associa una chiave ad un valore (k, v):

d = {}
d['bart'] = 'marge'
d['maggie'] = 'homer'
d['milhouse'] = 'nelson'
d['lisa'] = 'skinner'
>>> d
{'maggie': 'homer', 'lisa': 'skinner', 'bart': 'marge', 'milhouse': 'nelson'}

Esistono due modi di ordinare un dizionario:

    • La modalità “classica” e più conosciuta: ovvero ordinare il dizionario sulla base delle chiavi che lo compongono:
for k in sorted(d.keys()):
print k + ' : ' + d[k]

bart : marge
lisa : skinner
maggie : homer
milhouse : nelson
    • La modalità meno conosciuta e che ho dovuto ricercare [e che quindi condivido con voi] ovvero quella di ordinare il dizionario sulla base dei valori che sono associati alle chiavi:
sorted(d.items(), key=lambda(k,v):(v,k))
>>> [('maggie', 'homer'), ('bart', 'marge'), ('milhouse', 'nelson'), ('lisa', 'skinner')]

Come vedete questa volta abbiamo ottenuto una lista degli elementi ordinati secondo il valore associato ad ogni chiave. Può tornare utile!

Esistono molteplici versioni di quest’ultima istruzione, ma questa ritengo che sia la più compatta e veloce.

7 thoughts on “Python: come ordinare un dizionario [dict] per chiave o per valore”

  1. direi che potrebbe non funzionare…sto cercando di ordinare un dizionario per valore e non per chiave. Il tuo script a me restituisce questo messaggio:
    ValueError: too many values to unpack

    sono niubbo, quindi potrei aver fatto qualche errore io

  2. Se provi l’esempio che ho scritto, invece, funziona!
    Così a occhio ottieni ValueError perché sbagli la struttura dai che passi a sorted() [sicuro che sia un dict?]
    Puoi provare a mandarmi il sorgente [in privato], e gli darò un’occhiata.

  3. hai risolto con una riga di codice, una procedura che avrebbe richiesto tanto…
    ti faccio i miei più sentiti complimenti!!! Mi hai risolto davvero un grande problema!!! :D

  4. Ciao,

    quanto ritornato da sorted(d.items(), key=lambda(k,v):(v,k)) è in realtà una lista non un dizionario. Come faccio a ottenere il dizionario ordinato e non la lista?

    Grazie

    Lorenzo

  5. e se dovessi ordinare sulla base dei valori associati alle chiavi ma in ordine decrescente? come per esempio con una classifica..

    Grazie,
    Jack.

    1. In [1]: d = {‘foo’: 2, ‘baz’: 4, ‘bar’: 4, ‘yoo’: 7 }

      In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0]))
      Out[2]: [(‘yoo’, 7), (‘bar’, 4), (‘baz’, 4), (‘foo’, 2)]

Leave a Reply

Your email address will not be published. Required fields are marked *