Cicli for 6 - iterare dizionari
Scarica zip esercizi
Dato un dizionario, possiamo esaminare la sequenza di chiavi, di valori o entrambi con un ciclo for
.
Iterare le chiavi
Per iterare solo le chiavi è sufficiente usare l’operatore in
:
ATTENZIONE: l’ordine di iterazione delle chiavi non è prevedibile !
[2]:
diz = {
'bignè':5,
'brioche':8,
'krapfen':2
}
[3]:
for chiave in diz:
print('Trovata chiave', chiave)
print(' con valore', diz[chiave])
Trovata chiave bignè
con valore 5
Trovata chiave brioche
con valore 8
Trovata chiave krapfen
con valore 2
Ad ogni iterazione, alla variabile chiave
che abbiamo dichiarato viene assegnata una chiave presa dal dizionario, in un ordine che possiamo considerare non prevedibile.
Iterare coppie chiave valore
Possiamo anche ottenere direttamente nel for
sia la chiave che il valore corrispondente con questa notazione:
[4]:
for chiave, valore in diz.items():
print('Trovata chiave', chiave)
print(' con valore', diz[chiave])
Trovata chiave bignè
con valore 5
Trovata chiave brioche
con valore 8
Trovata chiave krapfen
con valore 2
.items()
ritorna una lista di coppie chiave/valore, e ad ogni iterazione una coppia viene assegnata alle variabili chiave
e valore
.
Iterare valori
Possiamo iterare i valori chiamando il metodo .values()
ATTENZIONE: anche l’ordine di iterazione dei valori non è prevedibile !
[5]:
for valore in diz.values():
print('Trovato valore', valore)
Trovato valore 5
Trovato valore 8
Trovato valore 2
Domande - iterare
Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
ATTENZIONE: Ricordati che l’ordine è IMPOSSIBILE da prevedere, quello che è importante è indovinare tutto quello che verrà stampato
for x in {'a':1,'b':2,'c':3}: print(x)
for x in {1:'a',2:'b',3:'c'}: print(x)
diz = {'a':1,'b':2,'c':3} for x in diz: print(x[diz])
diz = {'a':1,'b':2,'c':3} for x in diz: print(diz[x])
diz = {'a':1,'b':2,'c':3} for x in diz: if x == 'b': print(diz[x])
for k,v in {1:'a',2:'b',3:'c'}: print(k,v)
for x in {1:'a',2:'b',3:'c'}.values(): print(x)
for x in {1:'a',2:'b',3:'c'}.keys(): print(x)
for x in {1:'a',2:'b',3:'c'}.items(): print(x)
for x,y in {1:'a',2:'b',3:'c'}.items(): print(x,y)
Domande - Sono equivalenti?
Guarda i seguenti frammenti di codice: in ciascuno, vi sono due parti, A e B. In ciascun frammento, cerca di indovinare se la parte A stamperà esattamente quello che stampa il codice nella parte B
PRIMA pensa alla risposta
POI prova ad eseguire
Sono equivalenti ? postin
diz = {
'p':'t',
'o':'i',
's':'n',
}
print('A:')
for x in diz.keys():
print(x)
print('\nB:')
for y in diz:
print(y)
Sono equivalenti ? cortel
diz = {
'c':'t',
'o':'e',
'r':'l',
}
print('A:')
for p,q in diz.items():
print(q)
print('\nB:')
for x in diz.values():
print(x)
Sono equivalenti ? - gel
diz = {
'g':'l',
'e':'e',
'l':'g',
}
print('A:')
for x in diz.values():
print(x)
print('\nB:')
for z in diz.items():
print(z[0])
Sono equivalenti ? - giri
diz = {
'p':'g',
'e':'i',
'r':'r',
'i':'i',
}
print('A:')
for p,q in diz.items():
if p == q:
print(p)
print('\nB:')
for x in diz:
if x == diz[x]:
print(x)
Sono equivalenti? - Trovato
Prima pensa se sono equivalenti, poi verifica con tutti i valori di k
proposti.
Fai bene attenzione a questo esercizio !
Capire questo vuol dire aver veramente capito i dizionari ;-)
k = 'p'
#k = 'e'
#k = 'r'
#k = 'z'
diz = {
'p':'c',
'e':'h',
'r':'è',
}
print('A:')
for x in diz:
if x == k:
print('Trovato', diz[x])
print('\nB:')
if k in diz:
print('Trovato', diz[k])
Esercizi iterazione
Esercizio - colore di cuori
✪ Scrivi del codice che dato un dizionario semi
, per ogni seme stampa il suo colore.
Esempio - dato:
semi = {
'cuori':'rosso',
'picche':'nero',
'quadri':'rosso',
'fiori':'nero'
}
stampa:
ATTENZIONE: non ti preoccupare dell’ordine in cui vengono stampati i valori!
Sul tuo computer potresti vedere dei risultati diversi, l’importante è che vengano stampate tutte le righe.
Il colore di fiori è nero
Il colore di cuori è rosso
Il colore di picche è nero
Il colore di quadri è rosso
[6]:
semi = {
'cuori':'rosso',
'picche':'nero',
'quadri':'rosso',
'fiori':'nero'
}
# scrivi qui
Esercizio - preziosi
✪ Nel dizionario preziosi
alcune chiavi sono uguali ai rispettivi valori. Scrivi del codice che trova tali chiavi e le stampa.
Esempio - dato:
preziosi = {
'rubini' : 'giada',
'opali' : 'topazi',
'gemme' : 'gemme',
'diamanti': 'gemme',
'rubini' : 'rubini'
}
stampa
coppia di elementi uguali: rubini e rubini
coppia di elementi uguali: gemme e gemme
[7]:
preziosi = {
'rubini' : 'giada',
'opali' : 'topazi',
'gemme' : 'gemme',
'diamanti': 'gemme',
'rubini' : 'rubini'
}
# scrivi qui
Esercizio - potenze
✪ Dato un numero n
, scrvi del codice che crea un NUOVO dizionario diz
contenente come chiavi i numeri da 1 a n
INCLUSI, associando ad ogni chiave il suo quadrato.
Esempio - dato:
n = 5
dopo il tuo codice, deve risultare:
>>> print(diz)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
[8]:
n = 5
# scrivi qui
Esercizio - fiori
✪ Data una lista fiori
, scrivi del codice che crea un NUOVO dizionario diz
che associa ad ogni fiore True
se il nome del fiore è scritto tutto in maiuscolo, e False
altrimenti
SUGGERIMENTO: per verificare se una stringa è tutta in maiuscolo, usa il metodo
.isupper()
fiori = ['girasole','GAROFANO', 'tulipano', 'VIOLA', 'ROSA', 'violetta']
stampa (sono in ordine alfabetico perchè stampiamo con pprint
):
>>> from pprint import pprint
>>> pprint(diz)
{'GAROFANO': True,
'ROSA': True,
'VIOLA': True,
'girasole': False,
'tulipano': False,
'violetta': False}
[9]:
fiori = ['girasole','GAROFANO', 'tulipano', 'VIOLA', 'ROSA', 'violetta']
# scrivi qui
Esercizio - arte
✪ Un artista ha dipinto una serie di opere con diverse tecniche. Nel dizionario prezzi
per ciascuna tecnica segna il prezzo. L’artista intende fare una serie di esposizioni, e in ognuna presenterà una particolare tecnica. Supponendo che per ciascuna tecnica abbia prodotto q
quadri, mostrare quanto guadagnerà in ciascuna esposizione (supponendo venda tutto).
Esempio - dati:
q = 20
esposizioni = ['acquerello', 'olio', 'murale', 'tempera', 'carboncino','inchiostro']
prezzi = {'acquerello': 3000,
'olio' : 6000,
'murale' : 2000,
'tempera' : 4000,
'carboncino': 7000,
'inchiostro': 1000
}
Stampa - questa volta l’ordine conta!!
Guadagni previsti:
esposizione acquerello : 60000 €
esposizione olio : 120000 €
esposizione murale : 40000 €
esposizione tempera : 80000 €
esposizione carboncino : 140000 €
esposizione inchiostro : 20000 €
[10]:
q = 20
esposizioni = ['acquerello', 'olio', 'murale', 'tempera', 'carboncino','inchiostro']
prezzi = {'acquerello': 3000,
'olio' : 6000,
'murale' : 2000,
'tempera' : 4000,
'carboncino': 7000,
'inchiostro': 1000
}
# scrivi qui
Esercizio - cartolerie
✪ Un proprietario di due negozi di cartoleria per riorganizzare il magazzino vuole sapere i materiali in comune disponibili nei negozi che possiede. Dati quindi due dizionari cartoleria1
e cartoleria2
che associano oggetti alla loro quantità, scrivi del codice che trova tutte le chiavi in comune e per ciascuna stampa la somma delle quantità trovate.
Esempio - dati:
cartoleria1 = {'penne':10,
'cartelle':20,
'carta':30,
'forbici':40}
cartoleria2 = {'penne':80,
'cartelle':90,
'goniometri':130,
'forbici':110,
'righelli':120,
}
stampa (l’ordine non importa):
materiali in comune:
penne : 90
cartelle : 110
forbici : 150
[11]:
cartoleria1 = {'penne':10,
'cartelle':20,
'carta':30,
'forbici':40}
cartoleria2 = {'penne':80,
'cartelle':90,
'goniometri':130,
'forbici':110,
'righelli':120,
}
# scrivi qui
Esercizio - legumi
✪ Un magazzino ha scaffali numerati, ciascuno contenente una quantità di legumi espressa in chili. Rappresentiamo magazzino
come una lista. E’ disponibile anche un registro
come dizionario che associa ai nomi dei legumi il numero dello scaffale in cui sono contenuti nel magazzino.
Scrivi del codice che data una lista di nomi di legumi, mostra la somma dei chili presenti in magazzino per quei legumi.
Esempio - dati
legumi = ['ceci', 'soia']
# 0 1 2 3 4 5
magazzino = [50,90,70,10,20,50]
registro = {'piselli' : 3,
'soia' : 1,
'lenticchie': 5,
'ceci' : 4,
'fave' : 2,
'fagioli' : 0
}
dopo il tuo codice, deve stampare (l’ordine non importa):
Cerco ceci e soia ...
Trovati 20 kg di ceci
Trovati 90 kg di soia
Totale: 110 kg
[12]:
legumi = ['ceci', 'soia'] # 110
#legumi = ['fagioli', 'fave', 'lenticchie'] # 170
# 0 1 2 3 4 5
magazzino = [50,90,70,10,20,50]
registro = {'piselli' : 3,
'soia' : 1,
'lenticchie': 5,
'ceci' : 4,
'fave' : 2,
'fagioli' : 0
}
# scrivi qui
Esercizio - smog
✪ Scrivi del codice che dati due dizionari smog
e preposizioni
che associano a luoghi rispettivamente valori di smog e preposizioni, stampa tutti i luoghi indicando:
‘PREPOSIZIONE LUOGO l’inquinamento è eccessivo’ se il valore di smog è superiore a 30
‘PREPOSIZIONE LUOGO l’inquinamento è tollerabile’ altrimenti
NOTA: nella stampa la prima lettera delle preposizioni deve essere maiuscola: per trasformare la stringa puoi usare il metodo
.capitalize()
Esempio - dati:
smog = {'strada' : 40,
'ciclabile' : 20,
'autostrada': 90,
'parco' : 15,
'lago' : 5
}
preposizioni = {
'autostrada': 'in',
'ciclabile' : 'alla',
'lago' : 'al',
'parco' : 'al',
'strada' : 'in',
}
stampa (l’ordine non importa):
In strada l'inquinamento è eccessivo
Al parco l'inquinamento è tollerabile
In autostrada l'inquinamento è eccessivo
Al lago l'inquinamento è tollerabile
Alla ciclabile l'inquinamento è tollerabile
[13]:
smog = {'strada' : 40,
'ciclabile' : 20,
'autostrada': 90,
'parco' : 15,
'lago' : 5
}
preposizioni = {
'autostrada': 'in',
'ciclabile' : 'alla',
'lago' : 'al',
'parco' : 'al',
'strada' : 'in',
}
# scrivi qui
Esercizio - sport
✪✪ Scrivi del codice che dato un dizionario sport
in cui persone sono associate allo sport che preferiscono, crea un NUOVO dizionario conteggi
che associa ad ogni sport il numero di persone che lo preferiscono.
Esempio - dato:
sport = {'Gianni' : 'calcio',
'Paolo' : 'tennis',
'Sara' : 'pallavolo',
'Elena' : 'tennis',
'Roberto': 'calcio',
'Carla' : 'calcio',
}
Dopo il tuo codice, deve risultare:
>>> print(conteggi)
{'calcio': 3, 'pallavolo': 1, 'tennis': 2}
[14]:
sport = {'Gianni' : 'calcio',
'Paolo' : 'tennis',
'Sara' : 'pallavolo',
'Elena' : 'tennis',
'Roberto': 'calcio',
'Carla' : 'calcio',
}
# scrivi qui
Esercizio - ramarro
✪✪ Scrivi del codice che dato un insieme cerca
di caratteri da cercare, per ciascuno conta quanti ce ne sono nella stringa testo
e mette il numero nel dizionario conteggi
Esempio - dati:
[15]:
cerca = {'t','r','z'}
testo = "Il ramarro orientale è un sauro della famiglia dei Lacertidi, di colore verde brillante"
conteggi = {}
dopo il tuo codice, deve risultare:
>>> conteggi
{'z': 0, 't': 3, 'r': 9}
[16]:
#jupman-ignore-output
cerca = {'t','r','z'}
testo = "Il ramarro orientale è un sauro della famiglia dei Lacertidi, di colore verde brillante"
conteggi = {}
# scrivi qui
{'t': 3, 'r': 9, 'z': 0}
{'t': 3, 'r': 9, 'z': 0}
Modificare un dizionario durante l’iterazione
Supponi di avere un dizionario delle province
province = {'tn': 'Trento',
'mi':'Milano',
'na':'Napoli',
}
e di volerlo MODIFICARE in modo che dopo il tuo codice risultino aggiunte le sigle in maiuscolo:
>>> print(province)
{'tn' : 'Trento',
'mi' : 'Milano',
'na' : 'Napoli',
'TN' : 'Trento',
'MI' : 'Milano',
'NA' : 'Napoli',
}
Potrebbe venirti l’idea di scrivere qualcosa del genere:
for chiave in province:
province[chiave.upper()] = province[chiave] # ATTENZIONE !
DOMANDA: Vedi forse un problema?
Mostra rispostaX COMANDAMENTO: Non aggiungerai o toglierai mai elementi da una sequenza su cui stai iterando con un for
!
In questo caso, se proviamo ad eseguire il codice, otterremo un errore esplicito:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-26-9b20900057e8> in <module>()
----> 1 for chiave in province:
2 diz['chiave'.upper()] = diz[chiave] # ATTENZIONE !
RuntimeError: dictionary changed size during iteration
ma in altri casi (come per esempio con le liste) effettuare modifiche può produrre comportamenti del tutto imprevedibili (conosci forse l’espressione tirare il tappeto da sotto i piedi?)
E rimuovere? Abbiamo visto che aggiungere è pericoloso, ma lo è anche togliere.
Supponiamo di voler togliere qualunque coppia che abbia come valore 'Trento'
province = {
'tn': 'Trento',
'mi':'Milano',
'na':'Napoli',
}
affinchè risulti
>>> print(province)
{'mi':'Milano',
'na':'Napoli'}
Se proviamo ad eseguire qualcosa del genere per fortuna Python si accorge e ci lancia un’eccezione:
province = {
'tn': 'Trento',
'mi': 'Milano',
'na': 'Napoli',
}
for chiave in province:
if province[chiave] == 'Trento':
del province[chiave] # PESSIMA IDEA
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-23-5df0fd659120> in <module>()
5 'na':'Napoli'
6 }
----> 7 for chiave in province:
8 if province[chiave] == 'Trento':
9 del province[chiave] # PESSIMA IDEA
RuntimeError: dictionary changed size during iteration
Se proprio devi rimuovere elementi dalla sequenza su cui stai iterando, usa un ciclo while o effettua prima una copia della sequenza originale.
Esercizio - zazb
✪✪ Scrivere del codice che dato un dizionario diz
con caratteri come chiavi, MODIFICA il dizionario affinchè gli vengano aggiunte chiavi uguali a quelle esistenti ma precedute dal carattere 'z'
- come valore associato alle nuove chiavi, poni l’intero 10
Esempio - dato:
diz = {
'a':3,
'b':8,
'c':4
}
dopo il tuo codice, diz
dovrebbe risultare MODIFICATO così:
>>> diz
{ 'a':3,
'b':8,
'c':4,
'za':10,
'zb':10,
'zc':10
}
DOMANDA: E’ forse il caso di scrivere una soluzione come quella qua sotto? Leggi bene questo:
diz = {
'senso' : 1,
'di' : 2,
'inquietudine...': 3
}
for chiave in diz:
diz['z'+chiave] = 4 # ATTENZIONE !! GUAI IN VISTA !!
[17]:
diz = {
'a':3,
'b':8,
'c':4
}
# scrivi qui
Esercizio - brico
✪✪ Un magazzino per appassionati del fai da te dispone di un catalogo
che associa tipologie di oggetti agli scaffali dove posizionarli. Ogni giorno, una lista di arrivi
viene popolata con le tipologie di oggetti arrivati. Tali tipologie vanno collocate nel magazzino
, un dizionario che associa ad ogni scaffale la tipologia di oggetto prescritta dal catalogo. Scrivi del codice che data la lista di arrivi
e il catalogo
, popola il dizionario magazzino
.
Esempio - dati:
arrivi = ['sedie', 'lampade', 'cavi']
catalogo = {'stufe' : 'A',
'sedie' : 'B',
'caraffe' : 'D',
'lampade' : 'C',
'cavi' : 'F',
'giardinaggio' : 'E'}
magazzino = {}
dopo il tuo codice deve risultare:
>>> magazzino
{'B': 'sedie', 'C': 'lampade', 'F': 'cavi'}
[18]:
arrivi = ['sedie', 'lampade', 'cavi'] # magazzino diventa: {'B': 'sedie', 'C': 'lampade', 'F': 'cavi'}
#arrivi = ['caraffe', 'giardinaggio'] # magazzino diventa: {'D': 'caraffe', 'E': 'giardinaggio'}
#arrivi = ['stufe'] # magazzino diventa: {'A': 'stufe'}
catalogo = {'stufe' : 'A',
'sedie' : 'B',
'caraffe' : 'D',
'lampade' : 'C',
'cavi' : 'F',
'giardinaggio' : 'E'}
# scrivi qui
Esercizio - miniera
✪✪ Dato un dizionario miniera
che associa chiavi a numeri, MODIFICA il dizionario estratto
associando le stesse chiavi di miniera
a liste con le chiavi ripetute il numero di volte indicato.
Esempio - dati:
miniera = {'ottone': 5,
'rame' : 8,
'ferro' : 1}
estratto = {}
dopo il tuo codice deve risultare:
>>> print(estratto)
{'ottone': ['ottone', 'ottone', 'ottone', 'ottone', 'ottone'],
'rame' : ['rame', 'rame', 'rame', 'rame', 'rame', 'rame', 'rame', 'rame'],
'ferro' : ['ferro']}
[19]:
miniera = {'ottone' : 5,
'rame' : 8,
'ferro' : 1}
estratto = {}
# scrivi qui
Prosegui
Continua con cicli for annidati