Iterabili: stringhe e dizionari#
Gli array appena descritti (liste
e tuple
) sono, in Python, casi specifici di un’oggetto più generale: gli iterabili.
E’ possibile definire un iterabile come una qualunque variabile che è composta da “parti più piccole”, alle quali è possibile accedere singolarmente. Ad esempio, liste e tuple sono banalmente degli iterabili, le cui “parti più piccole” sono gli elementi che hanno all’interno.
Altro esempio di iterabili sono le stringhe
, poiché formate da una concatenazione di parti più piccole (i suoi caratteri). A queste, se ne aggiungono altri, alcuni dei quali approfondiremo in seguito:
Generatori
Dizionari
Insiemi
Non sono invece iterabili tutte le variabili rappresentanti numeri (int
, float
, etc.). Infatti, benché si potrebbe dire che siano composti da unità più piccole (le cifre), trattarli come tali andrebbe a creare complicazioni con alcune delle operazioni classiche tra iterabili.
Operazioni su iterabili#
La maggior parte delle operazioni che abbiamo visto sugli array sono in realtà operazioni comuni agli iterabili. Alcuni iterabili hanno dei vincoli specifici per cui non tutte le operazioni che vedremo sono applicabili a tutti gli iterabili.
Ad esempio, l’operazione di slicing (ovvero accedere ad un elemento tramite le parentesi quadre []
), è fattibile anche su stringhe.
# Definiamo una stringa
s: str = "pippo"
# Estraiamone un elemento
print(s[2])
# Stampiamola al contrario
print(s[::-1])
p
oppip
Similmente, la funzione len()
, che indica il numero di elementi contenuti in un array, è utilizzabile anche su stringhe:
# Stampiamo la lunghezza della stringa precedentemente definita
print(len(s))
5
Infine, è possibile concatenare due iterabili (ovvero creare un nuovo iterabile, dello stesso tipo dei due su cui l’operazione è applicata), i cui elementi sono ottenuti mettendo insieme gli elementi dei primi due.
L’operazione di concatenazione, avviene come per gli array con il comando +
.
Dizionari#
Andiamo ad approfondire quindi una tipologia di iterabile che rivedremo più e più volte durante il corso: i dizionari. Essi infatti sono molto utili per organizzare dati complessi e lavorare con grandi quantità di informazioni in modo efficiente.
Un dizionario è una tipologia di array (che quindi contiene al suo interno elementi), i cui valori sono indicizzati da stringhe
, invece che dalla posizione dell’elemento nell’array, come di consueto. La stringa che indicizza un valore è detta chiave. I dizionari sono mutabili, il che significa che è possibile modificare, aggiungere o eliminare elementi anche dopo la loro creazione.
Per definire un dizionario, si utilizza la parentesi graffa {}
, all’interno della quale vengono scritte le chiavi (definite attraverso stringhe), che vengono associate al rispettivo valore tramite i :
.
Vediamo un esempio:
# Creazione di un dizionario vuoto
dizionario_vuoto = {}
# Dizionario con alcuni elementi
studente = {
"nome": "Luca",
"eta": 21,
"corso": "Calcolo Numerico"
}
print(studente)
{'nome': 'Luca', 'eta': 21, 'corso': 'Calcolo Numerico'}
Come qualunque iterabile, è possibile accedere ai valori nel dizionario specificando la chiave tra parentesi quadre []
.
# Accesso al valore associato alla chiave "nome"
print(studente["nome"]) # Output: Luca
Luca
E, chiaramente, è possibile allo stesso modo modificarne i valori.
# Modifica del valore della chiave "età"
studente["eta"] = 22
print(studente)
{'nome': 'Luca', 'eta': 22, 'corso': 'Calcolo Numerico'}
Per aggiungere una nuova chiave, è sufficiente richiamarla semplicemente tramite le parentesi quadre []
, e assegnarci un valore. Python si occuperà di creare la chiave (se non presente) o di modificarla (se presente).
# Aggiunta di una nuova chiave "voto"
studente["voto"] = 30
print(studente)
{'nome': 'Luca', 'eta': 22, 'corso': 'Calcolo Numerico', 'voto': 30}
E’ possibile ottenere una lista completa delle chiavi, dei valori, o delle coppie chiave-valore presenti in un dizionario, tramite i metodi: keys()
, values()
e items()
, rispettivamente.
# Utilizzo dei metodi descritti
print(studente.keys())
print(studente.values())
print(studente.items())
dict_keys(['nome', 'eta', 'corso', 'voto'])
dict_values(['Luca', 22, 'Calcolo Numerico', 30])
dict_items([('nome', 'Luca'), ('eta', 22), ('corso', 'Calcolo Numerico'), ('voto', 30)])
Note
E’ chiaramente possibile assegnare un dizionario come valore ad un’altro dizionario. Questo permette di organizzare ad esempio variabili di un’esperimento e altri valori utili.
# Creo vocabolario "classe" contenente degli "studenti"
classe = {
"studente1": {
"nome": "Mario",
"eta": 22,
"voto": 30,
},
"studente2": {
"nome": "Luca",
"eta": 21,
"voto": 25
}
}
print(classe)
{'studente1': {'nome': 'Mario', 'eta': 22, 'voto': 30}, 'studente2': {'nome': 'Luca', 'eta': 21, 'voto': 25}}