Laboratorio di Python
Dizionari, Esercizi su dizionari
Sara Zuppiroli
Università di Bologna
24 aprile e 3 maggio 2013
Sommario
1 Correzione esercizi
2 Domande sul Progetto
3 Dizionari
Estrazione senza reinserimento
Estrarre 10 carte da un mazzo di 40 senza reinserirle nel mazzo
def estrazione():
mazzo=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,27,28,29,30,31,32, 33, 34,35,36,37,38,39,40]
e=random.sample(s,10) #estraggo senza reinserimento come fa return e #codesto metodo
Restituisce errore perché?
Estrazione senza reinserimento
Estrarre 10 carte da un mazzo di 40 senza reinserirle nel mazzo
def estrazione_briscola_noreinserimento():
Semi=["Bastoni", "Coppe", "Denara", "Spade"]
Numeri=["Asso",2,3,4,5,6,7,"Fante","Cavallo","Re"]
result=[]
while len(result)<10:#compie 10 estrazioni
S1=random.choice(Numeri)#scelta casuale numeri S2=random.choice(Semi)#scelta casuale semi final=str(S1)+ " di " +S2
if final not in result:
#se c'e' gia' non la prende e quindi continua
#ad iterare. se non c'e' allora aggiunge a result.
result.append(final) return result
Domande
Quando viene definita una frase viene detto che é delimitata da qualsiasi segno di punteggiatura: quindi tutti i segni li elencati come punteggiatura? anche l’a-capo e la virgola per quanto riguarda i segni di punteggiatura: nel testo ne sono elencati solo alcuni, ma per esempio i segni come > e <, che di solito aprono un discorso diretto, vanno da considerarsi come limiti di frasi?
Suddivisione delle frasi: Pippo, pluto. paperino; /n Paperone.
Quante frasi sono?
Quando si dice numero di lettere si intende lettere dell’alfabeto solamente o anche cifre e punteggiatura?
Domande
Per quanto riguarda tutti i caratteri speciali come (&, %, Û, ecc..) sono da considerarsi tra segni di punteggiatura o segni
alfabetici?
Quando si legge un file, se in esso vi sono dei tab o altri comandi simili vengono trasformati in
t ecc. a seconda dei casi oppure si deve ripulire il testo da questi in modo che non vi sia un conteggio errato delle lettere?
Definizione e Inizializzazione
I dizionari sono sequenze mutabile. I dizionari hanno un indice chiamato chiave. La chiave é definibile da un qualunque tipo immutabile.
Per inzializzare un dizionario d si usa il comando:
d = {}
Definizione e Assegnazione
d = {chiave : val, chiave2 : val, · · · }
chiave puó essere di tipo stringa, intero, tupla, ecc... qualsiasi tipo immutabile
Val puó essere definito qualsiasi tipo anche un dizionario stesso
Ad esempio:
d = {0vocali0: (0a0,0e0,0i0,0o0,0u0),0consonanti0 : (0b0,0c0, ...),0punteggiatura0: (0:0,0;0)}
chiavi del nostro dizionario sono: ’vocali’, ’consonanti’ ,
’punteggiatura’
valori referenziati dalle rispettive chiavi sono (’a’,’e’,’i’,’o’,’u’);
(’b’,’c’, ...); (’,’,’;’)
Operazioni sui dizionari
Modifica : d[’vocali’] = (’a’,’e’,’i’,’o’,’u’, ’A’,’E’, ’I’, ’O’,’U’) → modifica la chiave giá presente con i valori a destra dell’uguale Assegnazione : d[’alfabeto’]=(’a’,’b’, ... )→ associa alla variabile d
una nuova chiave con i valori a destra dell’uguale Cancellazione : del d[’consonanti’] → cancella da d la chiave e i
valori ad essa associati
Numero di coppie chiave valore len(d) → conta il numero di coppie chiave valore presenti nel dizionario d
Metodi dei dizionari versione 2.x
keys : d.keys → ritorna la lista delle sue chiavi
values d.values → ritorna la lista dei valori in un dizionario has_key → d.has_key(’vocali’) prende come argomento una
chiave e ritorna (1) se la chiave é presente nel dizionario 0 altrimenti
d.clear() : → metodo per cancellare tutti gli elementi da un dizionario.
Metodi key and values versione 3.x
keys : d.keys → ritorna la vista dinamica delle chiavi values d.values → ritorna la vista dinamica dei valori
Python 3.x
>>>d={'vocali': ('a','e','i','o','u'), 'consonanti': ('b','c', ...)}
>>> ks = d.keys()
>>> kv = d.values()
>>> print(ks)
(['vocali', 'consonanti'])
>>> print(kv)
([('a','e','i','o','u'),('b','c', ...) ])
>>> d['punteggiatura'] = (':',';')
>>> print(ks)
([vocali', 'consonanti' 'punteggiatura'])
>>> print(kv)
([('a','e','i','o','u'),('b','c', ...), (':',';')])
Python 2.x
>>>d={'vocali': ('a','e','i','o','u'), 'consonanti': ('b','c', ...)}
>>> ks = d.keys()
>>> kv = d.values()
>>> print(ks)
['vocali', 'consonanti']
>>> print(kv)
[('a','e','i','o','u'),('b','c', ...) ]
>>> d['punteggiatura'] = (':',';')
>>> print(ks)
['vocali', 'consonanti']
>>> print(kv)
[('a','e','i','o','u'),('b','c', ...) ]
Esercizio
1 Scrivere una funzione che dato un insieme di studenti e voti ad essi associati restituisca un dizionario degli studenti e dei voti ad essi associati, suddivisi per lettera del cognome. Le chiavi sono i gruppi (a-f), (g-o), (p-z); i valori le liste degli studenti e dei voti.
2 Si definisca la funzione di inserimento e cancellazione di un dato studente nel dizionario appena creato.
3 Si definisca la funzione che inserisca a uno studente presente nel dizionario una lista di voti.
Esercizio 1.1
def dizionario(s):
if type(s)==tuple:
d={}
k1=('A','F') k2=('G','O') k3=('P','Z')
d={k1:[],k2:[], k3:[]}
itero= list(d.keys()) # versione 3.x for i in range(len(s)):
for k in itero:
t=str(s[i][0])
if t[0] >= k[0] and t[0]<=k[len(k)-1]:
d[k].append(s[i]) return (d)
Esercizio 1.2a
def inser_studente(s,d):
itero= list(d.keys()) # versione 3.x for k in itero:
t=str(s[0])
if t[0] >= k[0] and t[0]<=k[len(k)-1]:
d[k].append(s) return (d)
Se stiamo usando la versione 2.x, il codice diventa: itero = d .keys()
Esercizio 1.2b
def canc_studente(s,d):
itero= list(d.keys()) # versione 3.x for k in itero:
t=str(s[0])
if t[0] >= k[0] and t[0]<=k[len(k)-1]:
ite=d[k]
lung=len(ite)
for l in range(lung):
if t == ite[l][0]:
del ite[l]
d[k]=ite return (d)
Cerca studente
def cerca_studente_n(s,d):
itero= list(d.keys()) # versione 3.x for k in itero:
if type(s)==list:
t=str(s[0])
if t[0] >= k[0] and t[0]<=k[len(k)-1]:
ite=d[k]
for l in range(len(ite)):
if t == ite[l][0]:
return (k,l) elif type(s)==str:
if s[0] >= k[0] and s[0]<=k[len(k)-1]:
ite=d[k]
for l in range(len(ite)):
if s == ite[l][0]:
return (k,l) return(None,None)
Esercizio 1.2b che richiama cerca_studente
def canc_studente_n(s,d):
k, l=cerca_studente_n(s,d) if k is not None:
ite=d[k]
del ite[l]
d[k]=ite return (d)
Esercizio 1.3
def insert_voto(s,d,n):
k, l=cerca_studente_n(s,d) ite=[]
if k is not None:
ite=d[k]
if type(n) == list:
for i in n:
ite[l][1].append(i) d[k]=ite
return d elif type(n)==int:
ite[l][1].append(n) d[k]=ite
return d return d
Esercizio 2
Si definisca una funzione che preso un dizionario di studenti e voti suddivisi per lettera, restituisca un dizionario con gli studenti suddivisi per intervalli di media di voto. Nel calcolo della media la lode
permette di arrotondare all’intero successivo, nel caso in cui nella lista dei voti non sia presente una lode l’arrotondamento é per difetto.
Esempio:
Studenti=(a-f):[[’Alighieri’,[24,30,26], · · · ],
[[’Boccaccio’,[18,22,24]], · · · ], (’g’-’o’):[[Manzoni,[30,29,30]], · · · ], (’p’,’z’)[[’Poe’,[23,30L,26]],· · · ]
Studenti_voto_medie=(18, 23): [’Boccaccio’, · · · ], (24,27):[Alighieri, ’Poe’,· · · ], (28-30):[’Manzioni’,· · · ]
Esercizio 2- calcolo medie
def media_voti_studente(l):
if type(l) == list:
s=0 ite=l
for i in ite:
s=s+i
return s/len(ite) return None
Esercizio 2 - funzione dizionario
def dizionario_media(d):
if type(d)==dict:
dm={}
k1=(18,23) k2=(24,26) k3=(27,30)
dm={k1:[],k2:[], k3:[]}
itero= list(d.values()) # versione 3.x itero2=list(dm.keys()) # versione 3.x for k in itero:
if len(k)>0:
for i in k:
t=str(i[0])
media=media_voti_studente(i[1])
Matrici sparse
Come rappresentare una matrice sparsa? La matrice sparsa é una matrice che ha quasi tutti i valori pari a zero.
Rappresentazione matrice sparsa
1 Matrice = [ [0,0,0,1,0], [0,0,0,0,0], [0,2,0,0,0], [0,0,0,0,0], [0,0,0,3,0] ]
2 Matrice = {(0, 3) : 1, (2, 1) : 2, (4, 3) : 3} → quindi la chiave risulta essere l’indice del valore diverso da zero e il valore é il valore diverso da zero della matrice
Perché scegliere la seconda implementazione?
Esercizi
Definiamo le funzioni che implementino le operazioni di:
somma moltiplicazione
indipendentemente dalla rappresentazione della matrice che é stata utilizzata.
Esercizi
Definire una funzione che preso un dizionario di studenti con i voti ad essi associati restituisca un dizionario che abbia per chiavi 4 intervalli di medie voti tali per cui la distribuzione degli studenti in questi 4 intervalli sia costante a meno di uno studente, e per valori i cognomi degli studenti appartenenti a quella media di voto.
Cosa abbiamo fatto?
1 Correzione esercizi
2 Domande sul Progetto
3 Dizionari