Liste, Tuple e Dizionari

Liste

Le liste sono la struttura dati più utilizzata in Python che, infatti, non prevede una struttura simile agli array Java e C/C++. Normalmente, tutto quello che si fa con gli array, in Python lo si fa con le liste che in aggiunta offrono delle funzionalità avanzate rispetto agli array.

Creare liste

Ci sono diversi modi per creare liste in Python i principali sono:

  • creare una lista “esplicitamente” (literal),
  • convertire un altro “oggetto” in una lista
  • usare la list comprehension
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# literal
lista1 = [1, 2, 3]
listaVuota = []
listaZeri = [0]*5 # [0, 0, 0, 0, 0]
listaZeriUni = [0,1]*2 # [0, 1, 0, 1]
tantiZeri = listaZeri*10
# conversione
listaNumeri = list(range(100)) # da 0 a 99
altraLista = list(listaNumeri) # copia la lista!
stessaLista = listaNumeri # copia il riferimento!
# list comprehension
ulterioreLista = [i for i in range(100)] # da 0 a 99

Notiamo alcune cose importanti dagli esempi sopra.

  • Una lista vuota si indica con [].
  • L’operatore di moltiplicazione * si può usare per creare tante copie di una lista.
  • L’assegnamento crea una copia del riferimento
    lista1 = [1, 2, 3]
    lista2 = lista1
    print(lista1)
    print(lista2)
    lista1[0] = 0 # cambia lista1 in [0, 2, 3] ma...
    print(lista1)
    print(lista2)
  • Per creare una copia di una lista (non del riferimento) si usa la funzione list.

Indicizzazione di una lista

Per accedere agli elementi di un lista si usa l’operatore [ ] (parantesi quadre), all’interno delle quadre si possono usare diversi valori:

  • indice singolo: lista[0], lista[i]; notare che gli indici iniziano da 0;
  • indice di partenza e di fine lista[inizio:fine] (0 come inizio e n come fine si possono omettere):
    lista = list(range(10)) # [0, 1, ..., 9]
    print(lista[0:3]) # elementi dalla posizione 0 (inclusa) alla 3 (esclusa) [0, 1, 2]
    print(lista[:3]) # lo stesso (quando l'inizio è 0 si può omettere)
    print(lista[2:4]) # elementi dalla posizione 2 (inclusa) alla 4 (esclusa) [2, 3]
    print(lista[3::]) # elementi dalla posizione 3 alla fine [3, 4, 5, ..., 9]
    print(lista[:]) # stampa tutta la lista (anche lista[::])
  • indice stride: inizio, fine e passo lista[inizio:fine:passo]
    lista = list(range(10)) # [0, 1, ..., 9]
    print(lista[0:5:2]) # da posizione 0 a 5 (esclusa) a salti di due [0, 2, 4]
    print(lista[::3]) # tutta la lista a salti di 3 [0, 3, 6, 9]
  • indici negativi: ultimo elemento ha indice -1: lista[-1]`
    print(lista[-1]) # 9 (no lista, ma numero!)
    print(lista[-3:-1]) # Attenzione! [7, 8] non [8, 9] e non [7, 8, 9]
    print(lista[-3::]) # Ultimi tre elementi [7, 8, 9]

List comprehension

Python offre un metodo estremamente flessibile per creare liste he viene chiamato list comprehension. La list comprehension è un modo comodo e soprattutto di creare liste utilizzando dei cicli. Partiamo da un esempio che non usa la list comprehension. Vogliamo creare una lista che contiene tutti i numeri \(x^2\) per ogni \(x\) intero positivo tra 1 e 9 dispari, cioè vogliamo la seguente lista

[1, 9, 25, 49, 81]

usando un ciclo for, la funzione range ed il metodo append delle liste, potremmo scrivere qualcosa del genere

1
2
3
4
5
lista = []
for i in range(10):
    if (i % 2 == 1):
        lista.append(i*i)
print(lista) # [1, 9, 25, 49, 81]
Usando la list comprehension tutto si può ridurre ad una sola riga
lista = [i*i for i in range(10) if i % 2 == 1]
Cerchiamo di capire dall’esempio come funziona la lista comprehension

  • l’istruzione è un assegnamento, cioè qualcosa viene messo nella variabile lista;
  • ciò che viene messo nella variabile lista è in effetti una lista in quanto è racchiuso tra quadra [ ... ];
  • ogni elemento della lista sarà il risultato dell’operazione i*i, infatti abbiamo [i*i ...]
  • la variabile i viene definito attraverso una specie di ciclo for che fa variare i in range(10) per cui abbiamo `[i*i for i in range(10) …];
  • infine abbiamo anche una condizione che deve essere vera se vogliamo che il corrispondente i venga considerato, la condizione è che il resto della divisione per due (i%2) sia 1, questo determina l’istruzione finale [i*i for i in range(10) if i % 2 == 1]

Nella list comprehension può anche non esserci la condizione finale if ..., ad esempio se vogliamo tutti i quadrati dei numeri da 0 a 9 possiamo la stessa list comprehension senza il controllo:

lista = [i*i for i in range(10)]

Tuple

Le tuple sono simili alle liste

Dizionari

Iterare su dizionari

Conversioni utili

Da stringa a lista

La funzione split delle stringhe permette di dividere le parti (token) di una stringa mettendo ogni parte in una lista

record = "Mario Rossi Roma"
lista = record.split() 
print(lista) # ["Mario", "Rossi", "Roma"]

L’esempio mostra la divisione in base agli spazi, ma è possibile usare qualsiasi stringa come divisione

record = "Mari,Rossi,Roma"
lista = record.split(",") 
print(lista) # ["Mario", "Rossi", "Roma"]
record = "Mario - Rossi - Roma"
lista = record.split(" - ") 
print(lista) # ["Mario", "Rossi", "Roma"]

Da lista a stringa

Sempre usando le funzioni messe a disposizione per le stringhe si può eseguire l’operazione inversa di quanto visto sopra: unire gli elementi di una lista separandoli con una stringa arbitraria. In questo caso si usa la funzione join.

lista = ["Andrea", "Fumagalli", "Milano"]
stringa = " ".join(lista)
print(stringa) # "Andrea Fumagalli Milano" 
lista = ["Andrea", "Fumagalli", "Milano"]
stringa = ", ".join(lista)
print(stringa) # "Andrea, Fumagalli, Milano" 

Attenzione

Per usare la funzione join, è necessario che tutti gli elementi della lista data in input siano stringhe. In caso è possibile usare la list comprehension per convertire tutti gli elementi in stringa

lista = ["Andrea", "Verdi", 45]
", ".join([str(item) for item in lista])

  • Michele Schimd © 2024
  • Ultimo aggiornamento: 17/02/2024
  • Materiale di studio e di esercizio per gli alunni dello Zuccante.

Creative Commons License