HOWTO · Python

Invertire un dizionario in Python

Dimostra come invertire la coppia chiave-valore di un dizionario in Python

Questo articolo mostra diversi metodi per invertire un dizionario in Python.

Invertire un dizionario è diverso dal rovesciare una lista, significa invertire o cambiare gli elementi chiave e valore del dizionario, essenzialmente scambiandoli per qualsiasi scopo lo sviluppatore potrebbe usarlo.

Usa items() per invertire un dizionario in Python

I dizionari Python hanno una funzione incorporata chiamata items() che restituisce un oggetto iterabile che mostrerà le coppie chiave-valore dei dizionari sotto forma di una tupla.

Ad esempio, dichiara un dizionario di categorie casuali e stampalo usando items().

dct = {
    "Animal": "Dog",
    "Fruit": "Pear",
    "Vegetable": "Cabbage",
    "Tree": "Maple",
    "Flower": "Daisy",
}

print(dct.items())

Produzione:

dict_items([('Animal', 'Dog'), ('Fruit', 'Pear'), ('Vegetable', 'Cabbage'), ('Tree', 'Maple'), ('Flower', 'Daisy')])

Stampare un dizionario usando items() produrrà una lista iterabile di valori di tupla che possiamo manipolare usando il cicli for per i dizionari.

Invertire le coppie chiave-valore ripetendo il risultato di items() e cambiando la chiave e il valore.

dct = {v: k for k, v in dct.items()}
print(dct)

k e v nel cicli for rappresentano rispettivamente la chiave e il valore. v: k sono i segnaposto per la chiave e il valore in ogni iterazione, sebbene abbiamo impostato il valore precedente v come nuova chiave e la chiave precedente k come nuovo valore.

Produzione:

{'Dog': 'Animal', 'Pear': 'Fruit', 'Cabbage': 'Vegetable', 'Maple': 'Tree', 'Daisy': 'Flower'}

Gli elementi chiave e valore sono ora invertiti nell’output.

Chiavi con lo stesso valore in un dizionario invertito

Un altro scenario di esempio quando si inverte un dizionario è se ci sono più chiavi o valori con lo stesso valore. Questo è uno scenario più probabile per invertire un dizionario.

Ad esempio, un dizionario degli animali preferiti delle persone.

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

Se il dizionario viene invertito utilizzando il codice sopra, l’output non sarebbe come ci si aspetterebbe.

favAnimal = {v: k for k, v in favAnimal.items()}
print(favAnimal)

Produzione:

{'Dog': 'James', 'Cat': 'Jane', 'Lion': 'Jerome', 'Giraffe': 'Jared'}

Qui mancano 2 elementi dal dizionario originale perché ogni volta che una chiave o un valore si ripete nel bucle, il record esistente verrà sovrascritto.

Il dizionario contiene 3 persone con la coppia di valori Dog ma è stato copiato solo James perché questo era l’ultimo record con il valore di Dog e ha sovrascritto gli altri 2 elementi del dizionario.

Per risolvere questo problema, dovremmo memorizzare i valori in una lista in modo che vengano assegnati a una singola chiave.

Il codice di esempio completo:

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

favAnimal = {v: k for k, v in favAnimal.items()}

print(favAnimal)

Usa collections.defaultdict() per invertire un dizionario in Python

Il modulo collections ha una funzione defaultdict() che può manipolare i valori in un dizionario in Python.

defaultdict() è usato principalmente per creare valori predefiniti di chiavi inesistenti. Se accedi a una chiave inesistente, può dichiarare un valore predefinito per essa, anche se non esiste.

Questa funzione è utile nel nostro caso perché vogliamo istanziare un nuovo dizionario con valori che sono di un tipo di dati di lista.

Utilizzando lo stesso esempio favAnimal, inverti il ​​dizionario e converti i valori in una lista.

Innanzitutto, inizializza il nuovo dizionario usando defaultdict()

from collections import defaultdict

favAnimal_inverted = defaultdict(list)

Quindi, usa la comprensione dell’lista per l’inversione e memorizza i valori invertiti nel nuovo dizionario.

{favAnimal_inverted[v].append(k) for k, v in favAnimal.items()}

Infine, poiché defaultdict() crea una sorta di sottoclasse di un dizionario, riconvertilo nel tipo di dizionario di base avvolgendolo in dict().

result = dict(favAnimal_inverted)
print(result)

Produzione:

{'Dog': ['John', 'Jenny', 'James'], 'Cat': ['Jane'], 'Lion': ['Jerome'], 'Giraffe': ['Jared']}

John, Jenny e James sono ora nella stessa lista con la chiave Dog invece degli altri elementi sovrascritti dall’ultimo elemento che aveva Dog come valore.

Il codice di esempio completo:

from collections import defaultdict

favAnimal_inverted = defaultdict(list)
result = dict(favAnimal_inverted)
print(result)

In sintesi, usa items() per scorrere il dizionario e invertire chiavi e valori. Se per caso è probabile che il tuo set di dati abbia duplicati, assicurati di convertire i valori in una lista usando defaultdict() e manipolalo in modo che i valori del dizionario vengano aggiunti all’lista invece di sostituirli i valori esistenti.