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.ipynb
Prosegui 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+Invio
Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi
Shift+Invio
Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi
Alt+Invio
Se 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’
OrderedDict
dallecollections
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:
od2
DEVE 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
s
Ignora la possibilità che vi siano pari merito tra i più/meno frequenti
ricordati di importare
Counter
dacollections
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
[ ]: