Tuple, Set e Stringhe
Tuple
Le tuple sono collezioni ordinate ma non modificabili di elementi. Si usa l’operatore ()
tuple1 = (1,2,3)Una tupla di un solo elemento richiede comunque la virgola:
tuple2 = (6,)Come detto non sono modificabili, quindi una volta creata non si possono aggiungere, rimuovere o cambiare elementi.
Le tuple sono usate per proteggere i dati da modifiche accidentali, per gestire di normale gruppi di dati eterogenei, e per raggruppare più valori insieme come risultato di una operazione.
Le tuple hanno le stesse funzioni disponibili per le liste, eccetto quelle che le modificano.
coordinates = (45.09, 9.18)
print(coordinates[0]) # 45.09E’ possibile scorporare (operazione chiamata unpacking) memorizzando i loro valori in altrettante variabili quanti sono i loro elementi.
lat, lon = coordinatesL’unpacking non necessita nemmeno di una tupla definita:
lat, lon = (45.09, 9.18)
lat, lon = 45.09, 9.18 # le parentesi non sono obbligatorieE’ utile anche per invertire il valore di variabili:
a, b = b, aCon le tuple ora possiamo modificare l’esempio della lezione precedente inserendo anche il motivo di spesa della lista spese:
spese = [] # lista di coppie (importo, motivo)
fine = False
while not fine:
print('''\nMenu
1: inserisci spesa
2: elimina spesa
3: mostra totale spese
0: esci''')
scelta = int(input("Inserisci scelta: "))
if scelta == 0:
fine = True
elif scelta == 1:
importo = float(input("Inserisci importo: "))
motivo = input("Inserisci motivo: ")
spese.append((importo, motivo))
elif scelta == 2:
indice = int(input("Inserisci indice da eliminare: "))
del spese[indice]
elif scelta == 3:
print("\n\nINDICE\tIMPORTO\tMOTIVO")
for indice, (importo, motivo) in enumerate(spese):
print(f"{indice}\t{importo:.2f}\t{motivo}")
totale = sum(importo for importo, _ in spese)
print(f"\nTotale: {totale:.2f}")Set
Un set è una collezione non ordinata di elementi unici. Per unici si intende che non sono permessi valori duplicati nello stesso set. Si creano o con le parentesi graffe {} o con l’istruzione set() a partire da altra collezione.
frutta = {"mela", "banana", "arancia"}
# Creazione da una lista (rimuove i duplicati automaticamente)
lista_con_duplicati = [1, 2, 2, 3, 4, 4]
mio_set = set(lista_con_duplicati)
print(mio_set) # {1, 2, 3, 4}Gli elementi di un set non sono accessibili tramite indici, in quanto non sono ordinati. E’ quindi possibile fare:
colori = {"rosso", "verde", "blu"}
for c in colori:
print(c)Ma non è garantito l’ordine. Per ordinare si può comunque generare una lista anche temporanea ordinata con sorted:
numeri = {4, 1, 9, 2}
for n in sorted(numeri): # Ordina prima di ciclare
print(n)I set prevedono le operazioni insiemistiche: intersezione &, unione |, differenza – (elementi nel primo insieme ma non nel secondo), e xor ^ (il contrario dell’intersezione):
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# Intersezione (elementi in A E B)
print(set_a & set_b) # {3, 4}
# Unione (tutti gli elementi)
print(set_a | set_b) # {1, 2, 3, 4, 5, 6}
# Differenza (elementi in A ma NON in B)
print(set_a - set_b) # {1, 2}
# Differenza simmetrica (elementi in A o B ma non entrambi)
print(set_a ^ set_b) # {1, 2, 5, 6}Sono infine previsti i frozenset, che sono immutabili, ovvero non è possibile aggiungere o eliminare valori.
mio_frozen = frozenset([1, 2, 3])Gli insiemi sono utili in tutti quegli scenari in cui vogliamo rappresentare gruppi di informazioni univoche e non duplicabili, ad esempio gli ingredienti di una ricetta o una rosa di giocatori di una squadra. Possono servire inoltre per eliminare i duplicati da una lista (la si trasforma prima in set e poi di nuovo in lista), per unire senza duplicati liste diverse o per confrontare i valori di due liste.
Li useremo in un esempio qui sotto.
Stringhe
Le stringhe sono liste di caratteri immutabili e con un set di funzioni specifico. Immutabili significa che se modifichiamo una stringa in realtà Python crea una copia della stringa con le modifiche (che possiamo riassegnare alla stessa variabile).
saluto = "Ciao"
nome = 'Mario'
# Le triple virgolette servono per testi su più righe
testo_lungo = """Questa è una stringa
che occupa più righe."""Possiamo usare la formattazione f per creare stringhe:
saluto = f'{saluto} {nome}' # "Ciao Mario"In lettura si comportano come le liste, con indici e slicing e ciclo for:
parola = "Python"
print(parola[0]) # 'P' (primo carattere)
print(parola[-1]) # 'n' (ultimo carattere, indice negativo)
# Slicing: [inizio:fine]
print(parola[1:4]) # 'yth' (dal 2° al 5° carattere, escludendo il 4°)
for c in parola:
print(c) # stampa un carattere alla voltaVa però ricordata l’immutabilità:
parola[3] = 'y' # da erroreSono possibili svariate operazioni sulle stringhe:
| Metodo | Cosa fa | Esempio |
|---|---|---|
upper() / lower() | Maiuscole/minuscole | "ciao".upper() → 'CIAO' |
strip() | Rimuove spazi bianchi ai bordi | " testo ".strip() → 'testo' |
split(sep) | Divide la stringa in una lista | "A,B".split(",") → ['A', 'B'] |
replace(a, b) | Sostituisce un testo con un altro | "ciao".replace("a", "e") → 'cieo' |
in | Cerca se un testo è presente | "c" in "ciao" → True |
find(x) | Cerca se un testo è presente e restituisce la posizione | "ciao".find('c') → 0 |
Vediamo un esempio che unisce proprio stringhe e set.
preferenze = []
num_amici = int(input("Quanti amici vuoi includere? "))
for i in range(num_amici):
nome_amico = input(f"Inserisci il nome dell'amico numero {i + 1}: ")
print(f"Inserisci i cibi preferiti di {nome_amico} (separati da spazi):")
preferenze_cibo = set(input().split()) # prima dividiamo i cibi in singole stringhe e poi creiamo un set
preferenze.append(preferenze_cibo) # aggiungiamo il set alla lista
if num_amici > 0:
cibi_in_comune = set(preferenze[0])
cibi_i_cibi = set(preferenze[0])
for elenco_cibi in preferenze[1:]:
cibi_in_comune = cibi_in_comune & elenco_cibi # intersezione
tutti_i_cibi = cibi_in_comune | elenco_cibi # unione
# Stampa dei risultati
print("\nCibi comuni a tutti gli amici:", cibi_in_comune)
print("Tutti i cibi preferiti dagli amici:", tutti_i_cibi)Zip
La funzione zip permette di accoppiare elementi due liste in una lista unica che ha come elementi coppie di valori delle due liste originali.
nomi = ["Mario", "Luisa"]
voti = [6, 8]
zipped_list = zip(nomi, voti) # [("Mario", 6), ("Luisa", 8)]
for nome, voto in zipped_list: #unpacking
print(f"{nome} ha preso {voto}")Se si accoppiano liste di lunghezza diversa, si perdono gli elementi eccedenti la lista più lunga.
E’ possibile eseguire anche l’unzip:
coppie = [("Maria", "Roma"), ("Giovanni", "Milano")]
nomi, citta = zip(*coppie)
print(nomi) # ('Maria', 'Giovanni')
print(citta) # ('Roma', 'Milano')Esempio:
num_materie = int(input("Inserisci il numero materie"))
materie = []
voti = []
for i in range(num_materie):
materia = input(f"Inserisci materia {i+1}:")
materie.append(materia)
voto = float(input("Inserisci voto: "))
voti.append(voto)
print("MATERIA\tVOTO")
for materia, voto in zip(materie, voti):
print(f"{materia}\t{voto}")
