Dizionari 4 - classi speciali

Scarica zip esercizi

Naviga file online

Vi sono delle classi speciali di dizionari che possiamo usare:

Classe

Descrizione

OrderedDict

Dizionario che permette di mantenere l’ordine di inserimento delle chiavi

Counter

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 dalle collections

Esempio:

t1 = ('Alice', '143242903')
t2 = ('Bob', '417483437')
t3 = ('Carlo', '423413213')

dopo il tuo codice, dovrebbe risultare:

OrderedDict([('Alice', '143242903'), ('Bob', '417483437'), ('Charles', '423413213')])
Mostra soluzione
[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 NUOVO OrderedDict !!

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')])
Mostra soluzione
[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 da collections

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}
Mostra soluzione
[18]:


s = 'rattristato' # scrivi qui

Prosegui

Prosegui con le prime challenge

[ ]: