Dizionari 4 - classi speciali
Scarica zip esercizi
Vi sono delle classi speciali di dizionari che possiamo usare:
Classe |
Descrizione |
|---|---|
Dizionario che permette di mantenere l’ordine di inserimento delle chiavi |
|
Dizionario che permette di calcolare rapidamente istogrammi |
Che fare
scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:
dictionaries
dictionaries1.ipynb
dictionaries1-sol.ipynb
dictionaries2.ipynb
dictionaries2-sol.ipynb
dictionaries3.ipynb
dictionaries3-sol.ipynb
dictionaries4.ipynb
dictionaries4-sol.ipynb
dictionaries5-chal.ipynb
jupman.py jupman.py
ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.
apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook
dictionaries4.ipynbProsegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive.
Scorciatoie da tastiera:
Per eseguire il codice Python dentro una cella di Jupyter, premi
Control+InvioPer eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi
Shift+InvioPer eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi
Alt+InvioSe per caso il Notebook sembra inchiodato, prova a selezionare
Kernel -> Restart
OrderedDict
Come abbiamo detto in precedenza, quando stampiamo un dizionario con print o lasciamo la visualizzazione a Jupyter, l’ordine il più delle volte non è lo stesso di quello d’inserimento. Affinchè sia predicibile, devi usare un OrderedDict
Per poterlo usare, per prima cosa devi importarlo dal modulo delle collezioni:
[2]:
from collections import OrderedDict
[3]:
od = OrderedDict()
Un OrderedDict appare e si comporta come dizionari regolari:
[4]:
od['qualche chiave'] = 5
od['qualche altra chiave'] = 7
od[('una', 'tupla', 'immutabile','come chiave')] = 3
od["un'altra chiave"] = 'adesso una stringa!'
od[123] = 'hello'
La visualizzazione con Jupyter mantiene l’ordine:
[5]:
od
[5]:
OrderedDict([('qualche chiave', 5),
('qualche altra chiave', 7),
(('una', 'tupla', 'immutabile', 'come chiave'), 3),
("un'altra chiave", 'adesso una stringa!'),
(123, 'hello')])
Così come la print:
[6]:
print(od)
OrderedDict([('qualche chiave', 5), ('qualche altra chiave', 7), (('una', 'tupla', 'immutabile', 'come chiave'), 3), ("un'altra chiave", 'adesso una stringa!'), (123, 'hello')])
Vediamo come appare in Python Tutor:
[7]:
from collections import OrderedDict
od = OrderedDict()
od['qualche chiave'] = 5
od['qualche altra chiave'] = 7
od[('una', 'tupla', 'immutabile','come chiave')] = 3
od["un'altra chiave"] = 'adesso una stringa!'
od[123] = 'hello'
jupman.pytut()
[7]:
Esercizio: agenda OrderedDict
Scrivi del codice che date tre tuple come le seguenti, STAMPA un OrderedDict che associa nomi a numeri di telefono, nell’ordine in cui sono proposti
Il tuo codice deve funzionare con tuple qualsiasi
Non dimenticarti di importare l’
OrderedDictdallecollections
Esempio:
t1 = ('Alice', '143242903')
t2 = ('Bob', '417483437')
t3 = ('Carlo', '423413213')
dopo il tuo codice, dovrebbe risultare:
OrderedDict([('Alice', '143242903'), ('Bob', '417483437'), ('Charles', '423413213')])
[8]:
t1 = ('Alice', '143242903')
t2 = ('Bob', '417483437')
t3 = ('Charles', '423413213')
# scrivi qui
Esercizio - copia di OrderedDict
Dato un OrderedDict od1 contenente traduzioni Inglese -> Italiano, crea un NUOVO OrderedDict chiamato od2 che contiene le stesse traduzioni come input PIU’ la traduzione 'water' : 'acqua'
NOTA 1: il tuo codice dovrebbe funzionare con qualsiasi ordered dict di input
NOTA 2:
od2DEVE essere associata ad un NUOVOOrderedDict!!
Esempio - dato:
od1 = OrderedDict()
od1['dog'] = 'cane'
od1['home'] = 'casa'
od1['table'] = 'tavolo'
dopo il tuo codice, dovresti ottenere:
>>> print(od1)
OrderedDict([('dog', 'cane'), ('home', 'casa'), ('table', 'tavolo')])
>>> print(od2)
OrderedDict([('dog', 'cane'), ('home', 'casa'), ('table', 'tavolo'), ('water', 'acqua')])
[9]:
from collections import OrderedDict
od1 = OrderedDict()
od1['dog'] = 'cane'
od1['home'] = 'casa'
od1['table'] = 'tavolo'
# scrivi qui
Counter
Se abbiamo bisogno di contare quanti elementi diversi si trovano in una sequenza (in altre parole, se dobbiamo calcolare un istogramma delle frequenze), la classe Counter ci può tornare molto utile. Counter è un tipo di dizionario speciale. Prima di tutto, dobbiamo dichiarare a Python la nostra intenzione di usarlo, recuperandolo dal modulo collections:
[10]:
from collections import Counter
Supponiamo di voler contare quanti elementi diversi ci sono nella lista
['c', 'a', 'n', 't', 'a', 'r', 'e', 'l', 'l', 'a', 'n', 'd', 'o']
Possiamo inizializzare Counter così:
[11]:
istogramma = Counter(['c', 'a', 'n', 't', 'a', 'r', 'e', 'l', 'l', 'a', 'n', 'd', 'o'])
Se lo stampiamo, vediamo che per primi sono messi gli elementi più frequenti:
[12]:
print(istogramma)
Counter({'a': 3, 'n': 2, 'l': 2, 'c': 1, 't': 1, 'r': 1, 'e': 1, 'd': 1, 'o': 1})
ATTENZIONE: SE NON SI USA LA print JUPYTER STAMPERA’ IN ORDINE ALFABETICO!
[13]:
istogramma # occhio !
[13]:
Counter({'c': 1,
'a': 3,
'n': 2,
't': 1,
'r': 1,
'e': 1,
'l': 2,
'd': 1,
'o': 1})
Possiamo ottenere una lista con gli n più frequenti col metodo most_common, che ritorna una lista di tuple:
[14]:
istogramma.most_common(5)
[14]:
[('a', 3), ('n', 2), ('l', 2), ('c', 1), ('t', 1)]
Counter si può inizializzare con una sequenza qualsiasi, per esempio con tuple:
[15]:
ct = Counter((50,70,40,60,40,50,40,70,50,50,50,60,50,30,50,30,40,50,60,70))
print(ct)
Counter({50: 8, 40: 4, 70: 3, 60: 3, 30: 2})
o stringhe:
[16]:
cs = Counter('rabbrividirai')
[17]:
print(cs)
Counter({'i': 4, 'r': 3, 'a': 2, 'b': 2, 'v': 1, 'd': 1})
Vi sono altri metodi che si possono usare, ma per quelli facciamo riferimento alla documentazione di Python
Esercizio - frequenti
Dato una stringa s, scrivi del codice che stampa
il carattere più frequente
quello meno frequente
quante e quali frequenze diverse vi sono
Il tuo codice deve funzionare con qualsiasi stringa
sIgnora la possibilità che vi siano pari merito tra i più/meno frequenti
ricordati di importare
Counterdacollections
Esempio - data:
s = 'rattristato'
il tuo codice deve stampare:
Tra i più frequenti troviamo ('t', 4)
Tra i meno frequenti troviamo ('o', 1)
Vi sono 3 frequenze diverse: {1, 2, 4}
[18]:
s = 'rattristato'
# scrivi qui
Prosegui
Prosegui con le prime challenge
[ ]: