P.9 Liste

Se una variabile è un cassetto, allora una lista è un cassetto con degli scomparti. Anche le liste devono avere un nome e in più servirà un indice, necessario per selezionare lo scomparto interno che ci serve.

Una lista è come un cassetto con scomparti

I nomi che possiamo assegnare a una lista seguono le stesse regole utilizzate per le variabili. Le liste in Python non sono delle semplici strutture per i dati, ma sono degli oggetti complessi che forniscono una serie di metodi per modificare ed elaborare i dati contenuti. In questo paragrafo incontreremo i metodi principali. Iniziamo a creare delle liste:

numeri = [10, 20, 14]
nomi = ["Paolo", "Mario", "Anna"]

Gli elementi sono racchiusi tra due parentesi quadre e separati da virgole. Gli elementi di una lista possono anche essere eterogenei (cioè di diverso tipo). Quando creiamo liste con diversi tipi di dati, dobbiamo fare attenzione nel momento in cui li utilizziamo. Ecco un esempio:

mista = [2, 'mele', 2.4, 4, 'banane', 0.99]

Personalmente non incoraggerei l’uso di questo tipo di liste, preferendo altre soluzioni, per esempio l’utilizzo di classi ed oggetti che incontreremo più avanti.

Possiamo conoscere il numero di elementi presenti in una lista utilizzando len():

n = len(numeri)
print(“la lista contiene”, n, “elementi”)

Per estrarre un elemento dobbiamo indicare la sua posizione, ricordandoci che “i posti” partono da 0 e non da 1. Una lista definita con 10 elementi, avrà un indice che parte da 0 e arriva fino a 9. Per stampare il primo elemento della lista numeri scriveremo:

print(numeri[0])

Possiamo stampare il contenuto di una lista utilizzando print():

print(numeri)
print(nomi)

Per sostituire il valore di un elemento della lista è sufficiente sovrascriverlo o riassegnarlo. Nelle righe di codice che seguono stampo il contenuto di numeri, poi sostituisco il secondo elemento inserendo il numero 99 e quindi stampo di nuovo la lista per osservare l’effetto prodotto:

print(numeri)
numeri[1] = 99
print(numeri)

Fino ad ora abbiamo utilizzato solo liste contenenti elementi pre-caricati, ma possiamo anche crearne di vuote:

myList = []
print("Una lista vuota: ")
print(myList)

Una lista vuota è poco utile se non abbiamo modo di aggiungere elementi. Possiamo quindi utilizzare il metodo append():

myList.append(1)
print(myList)

È possibile, con append(), aggiungere anche delle liste a una lista:

elenco = ['foo', 'bar']
myList.append(elenco)
print(myList)

Il risultato ottenuto non sarà una lista unica contenente anche gli elementi di elenco, otterremo invece una lista il cui ultimo elemento è una lista!

Per inserire un elemento in una posizione particolare useremo insert(pos, el). Il parametro pos è la posizione (parte da 0) in cui inserire l’elemento specificato da el. Nell’esempio che segue inseriremo il numero 12 nella posizione 3, cioè quella occupata attualmente dal numero “4”, che slitterà nella posizione adiacente:

numeri = [1,2,3,4]
print("Elenco iniziale:”, numeri)
numeri.insert(3, 12)
print("Elenco finale:”, numeri)

Possiamo inserire più elementi alla fine della lista con extend():

numeri.extend([100, 200, 300])
print("Lista estesa: ", numeri)

Il parametro di extend() è una lista e possiamo passargli una variabile che contenga una lista oppure indicare esplicitamente gli elementi da accodare, opportunamente delimitati da due parentesi quadre.

Per rimuovere un elemento da una lista usiamo remove(el). Il parametro el non è la posizione ma è il valore dell’elemento da rimuovere!

numeri.remove(2)
print("ho rimosso l'elemento '2': ", numeri)

Ecco un’altro esempio per chiarire meglio il funzionamento di remove():

spesa = ['mele', 'pane', 'salame']
print(spesa)
spesa.remove('pane')
print(spesa)

Per rimuovere l’ultimo elemento di una lista possiamo usare anche pop():

numeri.pop()
print("Rimuovo l'ultimo elemento:")
print(numeri)

Il metodo pop() può ricevere anche un parametro che questa volta indica la posizione dell’elemento da rimuovere (partendo da 0):

numeri.pop(2)
print("rimuovo l'elemento alla pos. 2: ")
print(numeri)

Una matrice è una tabella organizzata in righe e colonne. Possiamo creare delle matrici, in Python, con una lista di liste. Ecco un esempio di matrice con 2 righe e quattro colonne:

matrice = [[10,20.30,40] , [11,22,33,44]]
print(matrice)

Possiamo ricavare delle sottoparti di una lista utilizzando il flessibile sistema degli intervalli di Python. Per estrarre un sottoinsieme di elementi da una lista possiamo indicare l’intervallo che ci interessa, indicando la posizione iniziale e quella finale, separate dai due punti:

numeri = [12, 23, 34, 45, 56, 67, 78, 89]
print("lista di partenza")
print(numeri)
lista2 = numeri[3:5]
print("parte della lista originale (sliced list):")
print(lista2)

Possiamo omettere il primo indice e in questo caso il sottoinsieme partirà dal primo elemento:

lista3 = numeri[:2]
print(lista3)

Omettendo il secondo indice selezioneremo gli elementi dalla posizione fornita fino alla fine della lista:

lista4 = numeri[5:]
print(lista4)

Ecco un listato che raccoglie tutte le operazioni svolte:

numeri = [10, 20, 14]
nomi = ["Paolo", "Mario", "Anna"]

mista = [2, 'mele', 2.4, 4, 'banane', 0.99]

#numero di elementi
n = len(numeri)
print("la lista contiene", n, "elementi")

# stampo o estraggo un elemento
print(numeri[0])

#stampo la lista:
print(numeri)
print(nomi)

#Come sostituisco il valore di un elemento?
print(numeri)
numeri[1] = 99
print(numeri)

#creo liste vuote
myList = []
print("Una lista vuota: ")
print(myList)
  
#aggiungo elementi
myList.append(1)
print(myList)

#aggiungo una lista a una lista
elenco = ['foo', 'bar']
myList.append(elenco)
print(myList)
  
#inseriamo un elemento
numeri = [1,2,3,4]
print("Elenco iniziale: ", numeri)
#aggiungo l'elemento 12 alla pos. 3.
numeri.insert(3, 12)
print(numeri)

#inserire più elementi alla fine della lista con extend():
numeri.extend([100, 200, 300])
print("Lista estesa: ", numeri)


#Per rimuovere un elemento usiamo remove(elemento)
numeri.remove(2)
print("ho rimosso l'elemento '2': ", numeri)

spesa = ['mele', 'pane', 'salame']
print(spesa)
spesa.remove('pane')
print(spesa)

#rimuovere l’ultimo elemento con pop()  
numeri.pop()
print("Rimuovo l'ultimo elemento:")
print(numeri)
#pop usa anche un indice
numeri.pop(2)
print("rimuovo l'elemento alla pos. 2: ")
print(numeri)


#Si possono creare anche delle liste a due dimensioni:
matrice = [[10,20.30,40] , [11,22,33,44]]
print(matrice)

#Prendere delle parti di una lista (slicing):
numeri = [12, 23, 34, 45, 56, 67, 78, 89]
print("lista di partenza")
print(numeri)
lista2 = numeri[3:5]
print("parte della lista originale (sliced list):")
print(lista2)
  
lista3 = numeri[:2]
print(lista3)

lista4 = numeri[5:]
print(lista4)

Listato 1.15 – Operazioni con le liste.