13. Le Liste

In questa lezione parleremo di un nuovo tipo di dato di Python: le liste.


Le Liste in Python

Il tipo di dato Lista di Python, come il nome suggerisce, ci permette di raggruppare più elementi tra di loro.

Le liste in Python sono molto potenti, possono infatti contenere al loro interno diversi tipi di dato anche tutti assieme e i vari elementi vengono ordinati in base ad un indice proprio della lista, in modo da semplificarne l'accesso.

Creiamo ora una variabile my_list ed assegniamole una lista che contenga al suo interno dati di tipo integer, float e string. Per dichiarare una lista usiamo una coppia di parentesi quadre, e i vari elementi contenuti sono separati da una virgola

>>> my_list = [9.81, "pasta", 22, 44, 3.14]
>>> type(my_list)

# output
<class 'list'>

Per ottenere in output il valore associato alla variabile my_list, in questo caso la nostra lista, possiamo usare anche stavolta il nome della variabile come visto finora con tutte le altre tipologie di dato:

>>> my_list

# output
[9.81, 'pasta', 22, 44, 3.14]

Le liste sono così versatili che volendo possono contenere anche altre liste:

>>> new_list = ["asd", "poker", "luna", my_list]
>>> new_list

# output
['asd', 'poker', 'luna', [9.81, 'pasta', 22, 44, 3.14]]


Gli indici del tipo di dato list in Python

Abbiamo detto che gli elementi sono ordinati in base ad un indice proprio di ciascuna Lista, e ciò significa che a ciascun elemento è associato un numero che ne rappresenta la posizione nell'elenco: comprendere ciò è fondamentale perché se vogliamo accedere ad un elemento specifico avremo bisogno dell'indice corrispondente nella lista.

NOTA FONDAMENTALE: le liste iniziano ad indice 0.

RIPETO: il primo indice delle liste è 0.

Per richiamare "pasta" dovremo quindi usare l'indice 1:

my_list[1]
'pasta'

Mentre per ottenere 9.81 dovremo usare l'indice 0:

my_list[0]
9.81

Per facilitare la comprensione da un punto di vista visivo ho preparato questo schema:

schema rappresentativo della lista my_list

Talvolta può dimostrarsi utile accedere agli elementi della lista partendo dalla fine: in questo caso possiamo usare indici negativi, partendo da -1:

my_list[-1]
3.14

Facciamo ora un esempio partendo da una lista di numeri primi.

Per ottenere un insieme di elementi contenuti in una lista, possiamo usare lo slicing, che si traduce letteralmente come affettare.

Questo ci permette di ottenere una "sottolista" di elementi a partire da due indici, e volendo possiamo assegnare questa nuova lista a una nuova variabile:

primi = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
primi[4:10]

# output
[11, 13, 17, 19, 23, 29]


fetta = primi[4:10]
fetta

# output
[11, 13, 17, 19, 23, 29]

Possiamo impostare questo indice variabile anche in modo da farlo iniziare, o terminare, con l'inizio oppure la fine della lista, utilizzando i due punti :.

Per ottenere tutti i numeri dal 5o all'ultimo nella nostra lista possiamo fare:

>>> primi[4:]
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

Ho utilizzato il quarto elemento perché partendo dall'indice 0, il quinto elemento nella lista primi sarà appunto quello con indice 4.

Parallelamente possiamo inoltre ottenere tutti gli elementi a partire dal primo fino ad una soglia da noi scelta in questo modo:

>>> primi[:5]
[2, 3, 5, 7, 11]


Liste e cicli for

Le liste sono davvero ovunque e vi capiterà di introntrarle spessisimo, forse anche più di altri tipi di dato! È quindi fondamentale tenere a mente che per navigare il contenuto di una lista possiamo usare ad esempio i cicli for:

primi = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
match = 11

for el in primi:
    if el == match:
        output = str(el) + " == " + str(match)
        print("Match! " + output)
    else:
        print(element)


# output
2
3
5
7
Match! 11 == 11
13
17
19
23
29
31
37
41
43
47

Torniamo ora all'esempio della variabile new_list, che al suo interno contiene anche la lista my_list. Volendo ottenere uno specifico elemento dalla lista my_list possiamo usare un doppio indice:

>>> my_list = [9.81, "pasta", 22, 44, 3.14]
>>> new_list = ["asd", "poker", "luna", my_list]
>>> new_list[-1][1]

# output
'pasta'


I Metodi delle Liste

Proviamo ora ad aggiungere un nuovo elemento alle nostre liste. Supponiamo di avere una lista della spesa e di voler aggiungere un nuovo elemento da acquistare.

>>> spesa = ["riso", "pollo", "verdura"]
>>> spesa += "sapone"
>>> spesa

# output
['riso', 'pollo', 'verdura', 's', 'a', 'p', 'o', 'n', 'e']

Python non ci da errore, ma otteniamo un output decisamente controintuitivo! Questo perché in un certo senso le stringhe di Python sono delle liste di caratteri. Al di là di questo, otteniamo un errore provando ad aggiungere altre tipologie di dati.

>>> spesa = ["riso", "pollo", "verdura"]
>>> spesa += 3.14

# output
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object is not iterable

Per lavorare con le liste di Python usiamo alcune specifiche istruzioni e delle funzioni "speciali" chiamate metodi. Senza scendere troppo nei dettagli avanzati, la particolarità dei metodi è che vengono richiamati su dati di un certo tipo.

Tipi di dato diversi avranno a disposizione metodi diversi.

Diagramma dei metodi

Aggiungere elementi con append() ed extend()

Volendo aggiungere metodi singoli elementi ad una lista usiamo il metodo append():

>>> spesa = ["riso", "pollo", "verdura"]
>>> spesa.append("sapone")
>>> spesa

# output
['riso', 'pollo', 'verdura', 'sapone']

Mentre per aggiungere elementi ad una lista da una seconda lista usiamo il metodo extend():

>>> spesa_extra = ["camicia", "copri volante"]
>>> spesa.extend(spesa_extra)
>>> spesa

# output
['riso', 'pollo', 'verdura', 'sapone', 'camicia', 'copri volante']

Ordinare elementi tramite il metodo sort()

Il termine sort() è traducibile in Italiano come ordinare, o classificare.

Questo metodo ci consente di ordinare i valori all'interno di una lista mediante ordine alfabetico o numerico:

>>> alfabeto = ["z", "u", "a", "c", "v"]
>>> alfabeto.sort()
>>> alfabeto

# output
['a', 'c', 'u', 'v', 'z']

#############################

>>> numeri = [32, 1, 15, 2, 22, 23, 56, 88]
>>> numeri.sort()
>>> numeri

# output
[1, 2, 15, 22, 23, 32, 56, 88]

#############################

>>> numeri.sort(reverse=True)
>>> numeri

# output
[88, 56, 32, 23, 22, 15, 2, 1]

Il metodo index(): come ottenere l'indice di un elemento

Gli indici delle liste sono fondamentali perché identificano la posizione degli elementi al loro interno.

Per ottenere l'indice di uno specifico elemento possiamo usare il metodo index().

>>> numeri = [32, 1, 15, 2, 22, 23, 56, 88]
>>> numeri.index(22)

# output
4

############################

>>> numeri.index(88)

# output
7

Sostituire ed eliminare elementi tramite indice

Possiamo sostituire un elemento passando un nuovo valore all'indice dell'elemento che intendiamo sostituire, oppure cancellarlo:

>>> spesa = ["riso", "pollo", "verdura"]
>>> spesa[1] = "tacchino"
>>> spesa

# output
['riso', 'tacchino', 'verdura', 'sapone']

##########################

>>> del spesa[0]
>>> spesa

# output
['tacchino', 'verdura']

Rimuovere elementi con pop() e remove()

Infine, possiamo rimuovere elementi dalle liste usando anche i metodi pop e remove.

Con pop() rimuoviamo l'ultimo elemento della lista, mentre con remove() possiamo rimuovere elementi a partire dal loro valore:

>>> new_list = [True, None, "poker", 4.20, 1945]
>>> new_list

# output
[True, None, 'poker', 4.2, 1945]

################################

>>> new_list.pop()
1945
>>> new_list

# output
[True, None, 'poker', 4.2]

################################

>>> new_list.remove(None)
>>> new_list
[True, 'poker', 4.2]


L'elenco dei metodi delle liste non finisce qui, ma per ora direi che puo' bastare!

Parleremo ancora di liste più avanti nel corso.