Lezioni del modulo (2/4)
Dict e set comprehension
La stessa sintassi della list comprehension funziona anche per costruire dict e set, semplicemente cambiando le parentesi.
Dict comprehension
Sintassi: {chiave: valore for elemento in iterabile}.
quadrati = {n: n * n for n in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}Pattern frequente: trasformare una lista di tuple in dict.
coppie = [("a", 1), ("b", 2), ("c", 3)]
d = {k: v for k, v in coppie}
# {'a': 1, 'b': 2, 'c': 3}
# (equivalente a dict(coppie) in questo caso)Invertire chiavi e valori di un dict:
originale = {"a": 1, "b": 2, "c": 3}
invertito = {v: k for k, v in originale.items()}
# {1: 'a', 2: 'b', 3: 'c'}Filtrare un dict:
prezzi = {"mela": 1.2, "pera": 1.5, "kiwi": 2.5, "ananas": 4.0}
economici = {k: v for k, v in prezzi.items() if v < 2.0}
# {'mela': 1.2, 'pera': 1.5}Set comprehension
Sintassi: {espressione for elemento in iterabile}. Stessa cosa della list
comprehension, ma con graffe.
parole = ["ciao", "mondo", "ciao", "python"]
uniche = {p.upper() for p in parole}
# {'CIAO', 'MONDO', 'PYTHON'}Iniziali uniche di una lista di nomi:
nomi = ["Ada", "Linus", "Grace", "Alan", "Guido"]
iniziali = {n[0] for n in nomi}
# {'A', 'L', 'G'}Filtro + trasformazione
Come per la list comprehension, l'if finale filtra:
{n: n * n for n in range(10) if n % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}Dict comprehension per scambiare chiavi e valori
Un trucco molto comune per invertire un dizionario (scambiando chiavi con valori, assumendo che i valori siano unici) è:
dizionario_orig = {'a': 1, 'b': 2}
dizionario_inv = {valore: chiave for chiave, valore in dizionario_orig.items()}
# risultato: {1: 'a', 2: 'b'}Prova tu
Data `words = ['mela', 'pera', 'kiwi', 'banana']`, costruisci `lengths` come dict {parola: len(parola)}. Valuta `lengths`.
Mostra suggerimento
{p: len(p) for p in words}
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Data `nums = [1, 2, 2, 3, 4, 4, 5]`, costruisci `unique_squares` come SET dei quadrati. Valuta `unique_squares`.
Mostra suggerimento
Graffe senza ':' = set comprehension.
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
Data la lista di nomi `names = ["Alice", "Bob"]`, usa una dict comprehension per creare un dizionario che associ a ciascun nome la sua lunghezza in caratteri. Salva il dizionario in `name_lengths` e valutalo.
Mostra suggerimento
La sintassi è {name: len(name) for name in names}.
Soluzione disponibile dopo 3 tentativi