Ricerca di elementi in una lista in Python

Un'altra operazione fondamentale che le liste supportano in linguaggio Python è la ricerca di elementi.

Di base, ricercare un elemento in una lista consiste nel verificare se un elemento è presente o meno all'interno della lista. Dato che una lista può contenere ripetizioni, di solito la ricerca si ferma al primo elemento trovato.

In questa lezione ci concentreremo sulle due principali tecniche di ricerca fornite dal linguaggio Python: l'operatore in e il metodo index.

Ricerca di elementi in una lista in Python

Nella lezioni precedenti abbiamo visto come creare, modificare e eliminare elementi da una lista.

Adesso ci concentreremo sull'operazione di ricerca di elementi in una lista. In sostanza, la ricerca di un elemento all'interno di un contenitore, quale è una lista, consiste nello specificare un elemento e verificare la sua presenza.

Ora, specificare un elemento può significare molte cose. Nel caso di tipi di dato semplici, come possono essere tipi numerici, int e float, oppure stringhe, str, si può specificare il valore da ricercare. Pertanto la ricerca di un elemento in una lista consiste nel verificare se tale valore è presente o meno.

Ad esempio, in una lista che contiene numeri interi, basta specificare il valore del numero intero da ricercare.

Quando, invece, una lista contiene tipi di dato complessi, come vedremo nelle future lezioni, non è sufficiente specificare un valore. In questa lezione ci concentreremo su tipi semplici. In futuro vedremo come ricercare elementi in liste di liste, liste di dizionari, liste di tuple, ecc.

Il risultato della ricerca di un elemento in una lista può essere di due tipi:

  1. Un valore booleano che indica se l'elemento è presente o meno;
  2. L'indice dell'elemento nella lista.

Ricapitolando:

Definizione

Operazione di ricerca di un elemento in una lista

L'operazione di ricerca di un elemento in una lista consiste nel verificare se un elemento è presente o meno nella lista. Il risultato della ricerca può essere un booleano oppure l'indice dell'elemento nella lista.

Peculiarità delle liste

Prima di addentrarci nei dettagli della ricerca, bisogna tenere a mente alcuni dettagli delle liste, che altre strutture dati non hanno.

In primo luogo una lista può contenere duplicati. Questo significa che un elemento può essere presente più volte nella lista. Inoltre, una lista è ordinata. Per tal motivo, quando si cerca un elemento si possono verificare tre casi:

  1. L'elemento non è presente;
  2. L'elemento è presente e vi è una sola occorrenza;
  3. L'elemento è presente e vi sono più occorrenze.

In sostanza, l'operazione di ricerca parte dall'elemento con indice inferiore e prosegue fino all'elemento con indice superiore. In questo modo, se l'elemento è presente, viene restituito l'indice del primo elemento trovato.

Avendo chiarito questi concetti possiamo passare alle tecniche pratiche di ricerca.

Verificare la presenza di un elemento in una lista con l'operatore in

La prima tecnica di ricerca che vedremo sfrutta l'operatore incorporato del linguaggio Python in. Questo operatore permette di verificare se un elemento è presente o meno in un contenitore.

In particolare l'operatore in restituisce un valore booleano, True se l'elemento è presente, False altrimenti.

Ad esempio:

>>> lista = [1, 2, 3, 4, 5]
>>> 3 in lista
True
>>> 6 in lista
False

Un altro esempio di verifica della presenza di una stringa in una lista:

>>> lista = ["ciao", "come", "va"]
>>> "ciao" in lista
True
>>> "buongiorno" in lista
False

L'operatore in può essere utilizzato anche in combinazione con un'istruzione if:

lista = [1, 2, 3, 4, 5]
if 3 in lista:
    print("L'elemento è presente")
else:
    print("L'elemento non è presente")
Definizione

Operatore in per le Liste

L'operatore in permette di verificare se un elemento è presente o meno in una lista. Il risultato è un valore booleano.

Ottenere l'indice di un elemento: index

L'operatore in visto sopra controlla esclusivamente se un elemento è presente o meno. Non ci dice nulla sulla sua posizione. Per questo scopo esiste il metodo index.

Il metodo index permette di ottenere l'indice di un elemento in una lista. Possiamo vedere questo metodo come l'inverso dell'operazione di indicizzazione.

Vediamo con un esempio:

>>> lista = [1, 2, 3, 4, 5]
>>> lista[2]
3
>>> lista.index(3)
2

In questo esempio abbiamo ottenuto l'indice dell'elemento 3 nella lista. Se l'elemento non è presente nella lista, viene sollevata un'eccezione ValueError:

>>> lista = [1, 2, 3, 4, 5]
>>> lista.index(6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 6 is not in list

Se vi sono più elementi uguali nella lista, viene restituito l'indice del primo elemento:

>>> lista = [1, 2, 3, 4, 5, 3]
>>> lista.index(3)
2
Definizione

Metodo index per le Liste

Il metodo index permette di ottenere l'indice di un elemento in una lista. La sintassi è la seguente:

lista.index(elemento)

Se vi sono più occorrenze dell'elemento nella lista, viene restituito l'indice del primo elemento.

Dal momento che il metodo index restituisce un errore in caso di assenza dell'elemento, per poter gestire questo caso bisogna usare un blocco try/except. Tuttavia, vedremo la gestione delle eccezioni nelle prossime lezioni. Per il momento vediamo un semplice esempio:

lista = [1, 2, 3, 4, 5]
try:
    indice = lista.index(6)
except ValueError:
    print("L'elemento non è presente nella lista")

In questo esempio, in caso di assenza dell'elemento nella lista, viene stampato un messaggio di errore. Questo perché il controllo di flusso passa al blocco except che cattura l'errore. Vedremo i dettagli sulla gestione degli errori e delle eccezioni nelle future lezioni.

In Sintesi

In questa lezione abbiamo visto come cercare un elemento in una lista. In particolare abbiamo visto due tecniche:

  1. L'operatore in che restituisce un valore booleano;
  2. Il metodo index che restituisce l'indice del primo elemento trovato.