Python sort dictionary by value: come si fa?

di Lorenzo Neri

Come eseguire un “sort”, quindi l’ordinamento su un dictionary Python per valore, quindi “by value”? Lo scopriamo in questo articolo.

L’ordinamento di un dizionario, quindi i più noti in inglese “dictionary” in Python, per valore e quindi non per chiave, può avvenire in modo molto semplice, ma è necessario suddividere i casi per versione di Python.

Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!

Sort dictionary by value con Python 3.7 e oltre

“Verso l’infinito e oltre!”

No, non c’è nulla Toy Story.

Nel pratico, dalla versione 3.7 e successive di Python succede una cosa quando inserisci dei valori in un dizionario: l’ordine viene preservato in base a l’ordine stesso di inserimento degli elementi.

Mi spiego meglio: se in un dizionario inserisci degli elementi uno alla volta, questi vengono mantenuti nello stesso ordine di inserimento all’interno del dizionario stesso.

Puoi trovare maggiori dettagli sulla documentazione ufficiale qui.

Chiarito questo punto, vediamo effettivamente come eseguire l’ordinamento, quindi la sort by value, per valore per queste versioni di Python:

dizionario = { 1: 2, 3: 4, 4: 3, 2: 1, 0: 0 }
dizionarioOrdinato = { chiave: valore for chiave, valore in sorted(dizionario.items(), key=lambda item: item[1]) }

Oppure:

dizionario = { 1: 2, 3: 4, 4: 3, 2: 1, 0: 0 }
dizionarioOrdinato = dict( sorted( dizioanrio.items(), key = lambda item: item[1] ) )

Come puoi vedere in entrambi gli esempi, agiamo sul dizionario stesso grazie a una lambda.

Chiarito questo, è giusto capire come fare nel caso utilizzassi versioni più vecchie di Python.

Come ordinare un dizionario se usi versioni Python più vecchie

In questo caso pensa un po’: non puoi ordinare un dizionario, ma solo una rappresentazione ordianta dello stesso.

Che vuol dire la frase in tecnichese di prima?

Che l’ordine nei dizionari non conta e non è considerato a differenza di altri tipi, come ad esempio le liste e le tuple.

Per esempio:

import operator
dizionario = { 1: 2, 3: 4, 4: 3, 2: 1, 0: 0 }
dizionarioOrdinato = sorted(dizionario.items(), key=operator.itemgetter(1))

Tramite il pacchetto “operator” ciò che otteniamo all’interno della variabile “dizionarioOrdinato” non è un dizionario, bensì una lista di tuple.

Tuttavia c’è da considerare una cosa importantissima: il package Python usato nell’esempio precedente può essere usato solo nel caso in cui tu stia usando Python inferiore alla versione 3.

Questo, perché da Python 3 l’unpacking non è permesso e ti suggerisco di approfondire questo problema qui.

Che facciamo quindi?

Agiamo così:

import collections
dizionario = { 1: 2, 3: 4, 4: 3, 2: 1, 0: 0 }
listaOrdinata = sorted(dizionario.items(), key = lambda kv: kv[1])
dizionarioOrdinato = collections.OrderedDict() 

Il pacchetto “collections” ci permette di convertire la lista ordinata (come abbiamo visto anche nell’esempio precedente) in un dizionario a tutti gli effetti.

Continua a scoprire di più con questi articoli!

Lascia un commento


The reCAPTCHA verification period has expired. Please reload the page.

Questo sito potrebbe fare uso di cookie e siccome l'UE mi obbliga a fartelo presente, eccoti il classico banner dove puoi decidere come gestirli. Accetta Leggi di più