Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Mauro Gregori
La funzione list()
list() è un metodo (funzione) che si utilizza per creare le liste vuote o per creare liste con determinati
valori.
• Creare liste vuote:
>>> vuota = list()
>>> vuota
[]
Che è equivalente a eseguire:
>>> vuota2 = []
>>> vuota2
[]
• Creare nuove liste contenenti elementi.
Ad esempio possiamo creare una lista di numeri interi da 0 a n usando la funzione range(n+1):
>>> interi=list(range(5))
>>> interi
[0, 1, 2, 3, 4]
Oppure possiamo creare la lista dei caratteri costituenti una data stringa:
>>> caratteri=list("Mauro Gregori")
>>> caratteri
['M', 'a', 'u', 'r', 'o', ' ', 'G', 'r', 'e', 'g', 'o', 'r', 'i']
La funzione len()
len(x) calcola la lunghezza di x (dove x è una lista o una stringa), cioè il numero dei suoi elementi.
Domanda: perché e quando sfruttare il primo modo, che utilizza l’indice per accedere agli elementi della
lista, invece del secondo modo, che lavora direttamente sugli elementi che compongono la lista?
Semplice! Quando dovremo operare sugli elementi della lista indipendentemente dalla loro posizione (leggi
indice) useremo il secondo modo, altrimenti il primo.
Vediamo qualche esempio:
a
ll
bbb
eeee
rrrrr
oooooo
DDDDDDD
iiiiiiii
NNNNNNNNN
aaaaaaaaaa
ttttttttttt
aaaaaaaaaaaa
lllllllllllll
eeeeeeeeeeeeee
>>> nomi
['Anna', 'Mauro', 'Lucia', 'Samuele', 'Pippo']
Programmare in Python - a.s. 2020-2021 Prof. Mauro Gregori
Attenzione! Questa operazione non è consentita sulle stringhe (Ricordate?! Non sono direttamente
modificabili!). Infatti:
>>> p = "Pippo"
>>> p[1]
'i'
>>> p[1] = "a"
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
p[1] = "a"
TypeError: 'str' object does not support item assignment
>>> nomi.remove("Samuele")
>>> nomi
['Anna', 'Mauro', 'Lucia', 'Pippo']
Attenzione! Tentare di cancellare un elemento non presente nella lista causa un errore:
>>> nomi.remove("Carlo")
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
nomi.remove("Carlo")
ValueError: list.remove(x): x not in list
Poiché il programmatore al tempo della scrittura del programma non può prevedere quali valori saranno
presenti in lista al momento dell’esecuzione di una cancellazione, per evitare il precedente errore si dovrà
condizionare l’operazione di cancellazione al controllo dell’effettiva presenza del valore da eliminare,
tramite il costrutto di selezione if…else…:
Dato inesistente
Anche in questo caso il tentativo di eliminare un elemento utilizzando un indice inesistente causerà un
errore:
Omettere il primo indice significa iniziare dal primo elemento della lista (equivale a utilizzare l’indice 0),
mentre omettere il secondo indice significa includere nello slicing tutti gli elementi fino all’ultimo.
>>> nomi[:3]
['Anna', 'Mauro', 'Lucio']
>>> nomi[1:]
['Mauro', 'Lucio', 'Samuele', 'Pippo']
>>> nomi[:]
['Anna', 'Mauro', 'Lucio', 'Samuele', 'Pippo']
Nell’ultimo esempio si dimostra che il non specificare sia l’indice d’inizio che quello di fine dello slicing
permette ti catturare tutti gli elementi della lista. A cosa può essere utile questa operazione? Serve a creare
una copia della lista d’origine:
Una domanda sorge spontanea: non sarebbe bastato il seguente assegnamento per ottenere identico
risultato?!
Ora anche in nome3 (quella creata con l’assegnamento senza lo slicing) è scomparsa la stringa ‘Lucio’
>>> nomi3
['Anna', 'Mauro', 'Samuele', 'Pippo']
Questo dimostra che nomi e nomi3 in realtà sono identificatori diversi che “puntano” alla stessa lista
(studiando più in profondità Python scopriremmo che nomi e nomi3 rappresentato l’indirizzo in memoria
del primo elemento dell’unica lista).
Sorprendentemente invece scopriamo che in nomi2 la stringa ‘Lucio’ esiste ancora, il che significa che
l’assegnamento con lo slicing ha realmente creato una seconda copia della lista nomi con identificatore
nomi3.
>>> nomi2
['Anna', 'Mauro', 'Lucio', 'Samuele', 'Pippo']