CodeGym /Corsi /Python SELF IT /Dizionari annidati

Dizionari annidati

Python SELF IT
Livello 11 , Lezione 7
Disponibile

7.1 Creazione di dizionari annidati

I dizionari annidati sono uno strumento super utile per descrivere strutture di dati complesse e li incontrerai frequentemente. Facciamoci un po' di pratica nella loro creazione.

Creazione di dizionari annidati

Ecco un esempio di come creare un dizionario annidato:


person = {
    "name": "Alice",
    "details": {
        "age": 25,
        "city": "New York",
        "address": {
            "street": "123 Main St",
            "zip": "10001"
        },
        "mother": "Jane Smith"
    },
    "gender": "female"
}
print(person)  # Output: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}, 'mother': 'Jane Smith'}, 'gender': 'female'}

In questo esempio, person è un dizionario che contiene il dizionario annidato details, il quale a sua volta contiene un altro dizionario annidato address.

Un dizionario annidato si può creare anche a partire da pezzi separati:


address = {
    "street": "123 Main St",
    "zip": "10001"
}
         
details = {
    "age": 25,
    "city": "New York",
    "address": address
}
         
person = {
    "name": "Alice",
    "details": details,
    "gender": "female"
}
print(person)  # Output: {'name': 'Alice', 'details': {'age': 25, 'city': 'New York', 'address': {'street': '123 Main St', 'zip': '10001'}}, 'gender': 'female'}

7.2 Accesso agli elementi di un dizionario annidato

L'accesso agli elementi di dizionari annidati è semplice e intuitivo. Ecco come si fa:

Accesso agli elementi di primo livello


name = person["name"]
print(name)  # Output: Alice

Accesso agli elementi di un dizionario annidato


age = person["details"]["age"]
city = person["details"]["city"]
print(age)  # Output: 25
print(city)  # Output: New York

Accesso agli elementi di un livello di annidamento più profondo


street = person["details"]["address"]["street"]
zip_code = person["details"]["address"]["zip"]
print(street)  # Output: 123 Main St
print(zip_code)  # Output: 10001

7.3 Modifica degli elementi di un dizionario annidato

Se hai capito come visualizzare gli elementi di qualsiasi livello di annidamento, modificarli sarà ancora più semplice:

Modifica dei valori di primo livello


person["name"] = "Bob"
print(person["name"])  # Output: Bob

Modifica dei valori di un dizionario annidato


person["details"]["age"] = 26
print(person["details"]["age"])  # Output: 26

Modifica dei valori di un livello di annidamento più profondo


person["details"]["address"]["city"] = "Los Angeles"
print(person["details"]["address"]["city"])  # Output: Los Angeles

Aggiunta di nuovi elementi a un dizionario annidato


person["details"]["phone"] = "123-456-7890"
print(person["details"]["phone"])  # Output: 123-456-7890

Eliminazione degli elementi di primo livello


# Rimuovere l'elemento 'country' dal dizionario 'person'
del person["country"]
print(person)  # L'elemento 'country' verrà rimosso dal dizionario

Eliminazione degli elementi da un dizionario annidato


# Rimuovere l'elemento 'phone' dal dizionario 'details'
del person["details"]["phone"]
print(person["details"])  # L'elemento 'phone' verrà rimosso dal dizionario 'details'

7.4 Iterazione attraverso i dizionari annidati

Esistono diversi modi per iterare su tutti gli elementi di un dizionario. I loop sono il metodo più semplice:

Iterazione sugli elementi di un dizionario annidato


for key, value in person.items():  # Iterare sul dizionario genitore
    if isinstance(value, dict):  # Se il valore è un dizionario
        for key2, value2 in value.items():  # Iterare sugli elementi del dizionario figlio
            print(f"{key} --> {key2}: {value2}")

Iterazione ricorsiva attraverso tutti i livelli di annidamento


def print_dict(d, indent=0):
    for key, value in d.items():
        print("  " * indent + str(key) + ": ", end="")
        if isinstance(value, dict):
            print()
            print_dict(value, indent + 1)
        else:
            print(value)
        
print_dict(person)

Scoprirai di più sulla ricorsione nella sezione "Algoritmi e Strutture Dati".

Tra l'altro, la ricorsione è comoda per cercare un valore in profondità nei dizionari annidati. Ecco un esempio:


def find_key(d, key):
    if key in d:
        return d[key]
    for k, v in d.items():
        if isinstance(v, dict):
            result = find_key(v, key)
            if result:
                return result
    return None
        
phone = find_key(person, "phone")
print(phone)  # Output: None (poiché l'elemento 'phone' è stato eliminato)
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION