Introduzione ai dizionari Python

Completato

Le variabili in Python consentono di archiviare vari tipi di dati. In precedenza si è appreso come archiviare stringhe e numeri:

name = 'Earth'
moons = 1

Sebbene questo metodo funzioni per piccole quantità di dati, può diventare sempre più complesso quando si usano dati correlati. Si supponga di voler archiviare informazioni sulle lune della Terra e sulle lune di Giove.

earth_name = 'Earth'
earth_moons = 1

jupiter_name = 'Jupiter'
jupiter_moons = 79

Si noti che le variabili sono state duplicate con prefissi diversi. Questa duplicazione può diventare ingombrante. Dal momento che si lavora spesso con set di dati correlati, ad esempio le precipitazioni medie per mesi diversi in città diverse, l'archiviazione singola di tali variabili come valori individuali non è un'opzione praticabile. È invece possibile usare i dizionari Python.

consentono di usare set di dati correlati. Un dizionario è una raccolta di coppie chiave/valore. È possibile immaginarlo come un gruppo di variabili all'interno di un contenitore, in cui la chiave è il nome della variabile e il valore è il valore memorizzato al suo interno.

Creare un dizionario

Python usa le parentesi graffe ({ }) e i due punti (:) per indicare un dizionario. È possibile creare un dizionario vuoto e aggiungere i valori in un secondo momento oppure popolarlo in fase di creazione. Ogni coppia chiave/valore è separata da due punti e il nome di ogni chiave è contenuto tra virgolette come valore letterale stringa. Poiché la chiave è un valore letterale stringa, è possibile usare qualsiasi nome appropriato per descrivere il valore.

Verrà illustrato ora come creare un dizionario per memorizzare il nome del pianeta terra e il relativo numero di satelliti:

planet = {
    'name': 'Earth',
    'moons': 1
}

Sono disponibili due chiavi: 'name' e 'moons'. Ogni chiave si comporta in modo molto simile a una variabile: ha un nome univoco e memorizza un valore. Tuttavia, le chiavi sono contenute all'interno di una singola variabile più grande, denominata planet.

In modo analogo a quanto avviene con le variabili normali, è necessario assicurarsi che i tipi di dati usati siano corretti. Nel valore moons di 1 nell'esempio precedente non sono state incluse virgolette intorno al numero perché si vuole usare un numero intero. Se si fosse usato '1', Python avrebbe visualizzato questa variabile come stringa, compromettendo la capacità di eseguire calcoli.

A differenza delle variabili regolari, i nomi delle chiavi non devono seguire le regole di denominazione standard per Python. È quindi possibile usare i nomi delle chiavi per essere più descrittivi nel codice.

Leggere i valori del dizionario

È possibile leggere i valori all'interno di un dizionario. Gli oggetti dizionario dispongono di un metodo get che è possibile usare per accedere a un valore tramite la relativa chiave. Per visualizzare il name è possibile usare il codice seguente:

print(planet.get('name'))
Earth

Come si può immaginare, l'accesso ai valori in un dizionario è un'operazione comune, per cui esiste una scelta rapida da tastiera. È anche possibile passare la chiave nella notazione tra parentesi quadre ([ ]). Questo metodo usa meno codice rispetto a get, quindi la maggior parte dei programmatori usa questa sintassi. È possibile riscrivere l'esempio precedente usando il codice seguente:

# planet['name'] is identical to using planet.get('name')
print(planet['name'])
Earth

Sebbene il comportamento di get e delle parentesi quadre ([ ]) sia generalmente lo stesso per il recupero degli elementi, esiste una differenza fondamentale. Se una chiave non è disponibile, get restituisce None e [ ] genera KeyError.

wibble = planet.get('wibble') # Returns None
wibble = planet['wibble'] # Throws KeyError

Modificare i valori del dizionario

È inoltre possibile modificare i valori all'interno di un oggetto dizionario usando il metodo update. Questo metodo accetta un dizionario come parametro e aggiorna tutti i valori esistenti con quelli nuovi che vengono forniti. Se si vuole modificare il name per il dizionario planet, ad esempio, è possibile usare il codice seguente:

planet.update({'name': 'Makemake'})

# No output: name is now set to Makemake.

È possibile usare la scelta rapida da tastiera tra parentesi quadre ([ ]) per modificare i valori, in modo analogo a quanto fatto per la lettura degli stessi. La differenza fondamentale nella sintassi consiste nell'uso di = (talvolta denominato operatore di assegnazione) per fornire un nuovo valore. Per riscrivere l'esempio precedente e modificare il nome, è possibile usare il codice seguente:

planet['name'] = 'Makemake'

# No output: name is now set to Makemake.

Il vantaggio principale di usareupdate consiste nella possibilità di modificare più valori in un'unica operazione. I due esempi successivi sono logicamente uguali, ma la sintassi è diversa. L'utente può scegliere liberamente la sintassi che ritiene più appropriata. La maggior parte degli sviluppatori sceglie parentesi quadre per aggiornare i singoli valori.

Nell'esempio seguente vengono apportate le stesse modifiche alla variabile planet, aggiornando il nome e i satelliti. Tenere presente che con update si esegue una singola chiamata alla funzione, mentre l'uso delle parentesi quadre prevede due chiamate.

Uso dell'aggiornamento:

planet.update({
    'name': 'Jupiter',
    'moons': 79
})

Uso delle parentesi quadre:

planet['name'] = 'Jupiter'
planet['moons'] = 79

Aggiungere e rimuovere chiavi

Non è necessario creare una o più chiavi durante l'inizializzazione di un dizionario. È possibile eseguire questa operazione in qualsiasi momento e assegnare la chiave esattamente come avviene con una chiave esistente.

Si supponga di voler aggiornare planet per includere il periodo orbitale in giorni:

planet['orbital period'] = 4333

# planet dictionary now contains: {
#   name: 'jupiter'
#   moons: 79
#   orbital period: 4333
# }

Importante

In modo analogo a quanto avviene con tutti gli altri elementi in Python, anche per i nomi delle chiavi viene fatta distinzione tra maiuscole e minuscole. Di conseguenza, 'name' e 'Name' sono considerate due chiavi separate in un dizionario Python.

Per rimuovere una chiave, usare pop. pop restituisce il valore e rimuove la chiave dal dizionario. Per rimuovere orbital period, è possibile usare il codice seguente:

planet.pop('orbital period')

# planet dictionary now contains: {
#   name: 'jupiter'
#   moons: 79
# }

Tipi di dati complessi

I dizionari sono in grado di archiviare qualsiasi tipo di valore, inclusi altri dizionari. In questo modo è possibile modellare dati complessi in base alle esigenze. Si supponga di dover archiviare il diametro per planet, che può essere misurato intorno all'equatore o ai poli. È possibile creare un altro dizionario all'interno di planet per archiviare queste informazioni:

# Add address
planet['diameter (km)'] = {
    'polar': 133709,
    'equatorial': 142984
}

# planet dictionary now contains: {
#   name: 'Jupiter'
#   moons: 79
#   diameter (km): {
#      polar: 133709
#      equatorial: 142984
#   }
# }

Per recuperare i valori in un dizionario annidato, è necessario concatenare le parentesi quadre o effettuare una chiamata a get.

print(f'{planet["name"]} polar diameter: {planet["diameter (km)"]["polar"]}')
Jupiter polar diameter: 133709