Come ordinare un dizionario per valore in Python

Introduzione

Un dizionario in Python è una raccolta di elementi che memorizza i dati come coppie chiave-valore. In Python 3.7 e versioni successive, i dizionari sono ordinati in base all'ordine di inserimento degli elementi. Nelle versioni precedenti, non erano ordinati.

In questo articolo, daremo un'occhiata a come ordinare un dizionario in base ai valori che contengono.

Ordina il dizionario usando a per Ciclo continuo

Possiamo ordinare un dizionario con l'aiuto di a for ciclo continuo. Per prima cosa, utilizziamo il sorted() funzione per ordinare i valori del dizionario. Quindi eseguiamo il ciclo dei valori ordinati, trovando le chiavi per ciascun valore. Aggiungiamo queste coppie chiave-valore nell'ordine ordinato in un nuovo dizionario.

Nota: L'ordinamento non consente di riordinare il dizionario sul posto. Stiamo scrivendo le coppie ordinate in un dizionario completamente nuovo e vuoto.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

Se lo esegui con l'interprete Python vedresti:

{1: 1, 3: 4, 2: 9}

Ora che abbiamo visto come ordinare con i loop, diamo un'occhiata a un'alternativa più popolare che utilizza il sorted() funzione.

Ordina il dizionario usando il smistato() Funzione

In precedenza abbiamo utilizzato il sorted() funzione per ordinare i valori di un array. Quando ordiniamo un dizionario, possiamo passare un altro argomento a sorted() funziona in questo modo: sorted(dict1, key=dict1.get).

Qui, key è una funzione che viene chiamata su ciascun elemento prima che i valori vengano confrontati per l'ordinamento. Il get() metodo sugli oggetti dizionario restituisce il valore della chiave di un dizionario.

I sorted(dict1, key=dict1.get) expression restituirà l'elenco di chiavi i cui valori sono ordinati. Da lì, possiamo creare un nuovo dizionario ordinato:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

Usando il sorted() la funzione ha ridotto la quantità di codice che dovevamo scrivere durante l'utilizzo for loop. Tuttavia, possiamo ulteriormente combinare il sorted() funzione con il itemgetter() funzione per una soluzione più concisa all'ordinamento dei dizionari in base ai valori.

Ordina il dizionario usando il operatore Modulo e raccoglitore di oggetti ()

I operator il modulo include il itemgetter() funzione. Questa funzione restituisce un oggetto richiamabile che restituisce un elemento da un oggetto.

Ad esempio, usiamo itemgetter() per creare un oggetto richiamabile che restituisca il valore di qualsiasi dizionario con una chiave che è 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

Ogni dizionario ha accesso al items() metodo. Questa funzione restituisce le coppie chiave-valore di un dizionario come un elenco di tuple. Possiamo ordinare l'elenco delle tuple usando il itemgetter() funzione per estrarre il secondo valore della tupla, ovvero il valore delle chiavi nel dizionario.

Una volta ordinato, possiamo creare un dizionario basato su quei valori:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

Con molto meno sforzo, abbiamo un dizionario ordinato per valori!

Il key argomento accetta qualsiasi funzione, possiamo usare le funzioni lambda per restituire i valori del dizionario in modo che possano essere ordinati. Vediamo come.

Ordina il dizionario utilizzando una funzione Lambda

Le funzioni Lambda sono funzioni anonime o senza nome in Python. Possiamo usare le funzioni lambda per ottenere il valore di un elemento del dizionario senza dover importare il file operator modulo per itemgetter(). Se desideri saperne di più sulle lambda, puoi leggerle nella nostra guida a Funzioni Lambda in Python.

Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!

Ordiniamo un dizionario in base ai valori usando una funzione lambda nel file key argomento di sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

Nota che i metodi che abbiamo discusso finora funzionano solo con Python 3.7 e versioni successive. Vediamo cosa possiamo fare per le versioni precedenti di Python.

Restituzione di un nuovo dizionario con valori ordinati

Dopo aver ordinato un dizionario per valori, per mantenere un dizionario ordinato nelle versioni di Python precedenti alla 3.7, devi usare il OrderedDict – disponibile nel collections modulo. Questi oggetti sono dizionari che mantengono l'ordine di inserimento.

Ecco un esempio di ordinamento e utilizzo OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

Conclusione

Questo tutorial ha mostrato come ordinare un dizionario in base ai suoi valori. Per prima cosa abbiamo ordinato un dizionario usando due cicli for. Abbiamo quindi migliorato il nostro ordinamento utilizzando sorted() funzione. Abbiamo anche visto il itemgetter() funzione dal operator modulo può rendere la nostra soluzione più concisa.

Infine, abbiamo adattato la nostra soluzione per funzionare su versioni di Python inferiori alla 3.7.

Variazioni del sorted() sono le più popolari e affidabili per ordinare un dizionario in base ai valori.

Timestamp:

Di più da Impilamento