Python basics

Matteo Lugli

Created: 2024-01-25 gio 23:51

Table of Contents

Liste

Esempio 1

test = [1,2,3,4,5]
test = [i for i in range(1,6)]

Esempio 2

test = ["one", "two", "three", "four", "five"]
test = "one two three four five".split()

Esempio 3

test = "Group 1: 1,2,3,4; Group 2: 3,4,5,6"
result = [x.split(":")[1] for x in test.split(";")]

cosa c'e' in result? :)
(provate a capirlo senza eseguire il codice)

Esempio 4

test = [[1,2,3,4,5],[1,2,3,4,5]]
test = [[i for i in range(1,6)] for j in range(2)]

Le comprehensions sono utili per velocizzare la scrittura di codice noioso;

Esercizio

Dato un numero \(n\) scelto dall'utente, generare la seguente lista (\(n=4\)):

lista = [1, 'ciao', 2, 'ciao', 3, 'ciao', 4, 'ciao']
L = [x//2 + 1 if x%2 == 0 else "ciao" for x in range(0,2*n)]

Morale…

Dizionari

  • I dizionari sono oggetti che mantengono in memoria associazioni chiave-valore;
  • Le chiavi possono essere interi, caratteri, stringhe… oppure oggetti piu' complessi come tuple;

Esempio 1

data = {("matteo", "lugli"):1.89}
print(data["matteo"])

Cosa stampa?

ERRORE!

Quando le cose non vanno, si cerca di capire il motivo e di risolvere…

  • Quando accedo agli oggetti salvati nel dizionario, devo accedere usando una chiave "compatibile" con quelle salvate nel dizionario;
  • Il dizionario "data" contiene delle associazioni tupla-float, quindi se voglio sapere l'altezza di matteo devo specificare anche il cognome;

L'accesso corretto al dizionario e':

print(data[("matteo", "lugli")])

Aggiornare un elemento

Per aggiornare il valore associato a una chiave, la sintassi e' la seguente:

data[("matteo", "lugli")] = 1.90

Attenzione: alla chiave ("matteo", "lugli") puo' essere associato un solo valore!

Aggiungere una coppia chiave-valore

Per aggiungere un nuovo elemento ad un dizionario, la sintassi e' altrettanto semplice:

data[("giovanni", "varetto")] = 1.70
data[("filippo", "bondanelli")] = 1.84
data[("francesco", "terzi")] = 1.81

Dizionario come oggetto "iterabile"

Un dizionario (come la maggior parte degli oggetti in python) e' iterabile: significa che con un ciclo for possiamo visitare i suoi elementi:

for key, value in data.items():
        print("{} è alto {}".format(key, value))

Diamo un occhio all'output…

('matteo', 'lugli') è alto 1.9
('giovanni', 'varetto') è alto 1.7
('filippo', 'bondanelli') è alto 1.84
('francesco', 'terzi') è alto 1.81

Dato che la chiave key e' una tupla, l'output risulta non bellissmo a vedersi…

Un trick da maestro…

for key, value in data.items():
        print("{} {} è alto {}".format(*key, value))
matteo lugli è alto 1.9
giovanni varetto è alto 1.7
filippo bondanelli è alto 1.84
francesco terzi è alto 1.81

  • Con *key abbiamo "spacchettato" gli elementi salvati dentro key (che e' una tupla);
  • I valori spacchettati (nome e cognome) sostituiscono le parentesi graffe "{} {}" usate come placeholder;

\(\Rightarrow\) il nome e cognome compaiono separati da uno spazio, formattati correttamente.

Dict comprehension

E se ti dicessi… che le list comprehension funzionano anche per generare dizionari?

La logica e' la stessa delle list compr.,
e anche la sintassi e' simile.
Ad esempio:

l = ["one", "two", "three", "four"]
diz = {digit:i for i,digit in enumerate(l)}
print(diz)

Cosa stampa?

{'one': 0, 'two': 1, 'three': 2, 'four': 3}

  • Ottimo, abbiamo associato a ogni cifra scritta in caratteri il suo "digit", il problema e' che siamo partiti a contare da 0.
  • Aggiustiamo leggermente il codice, basta aggiungere 1 alla variabile \(i\):
l = ["one", "two", "three", "four"]
diz = {digit:i+1 for i,digit in enumerate(l)}
print(diz)

Come esercizio, cercate di capire in autonomia a cosa serve la direttiva enumerate().