Articolo originale: https://www.freecodecamp.org/news/python-find-in-list-how-to-find-the-index-of-an-item-or-element-in-a-list/

In questo articolo imparerai come trovare l'indice di un elemento contenuto in una lista nel linguaggio di programmazione Python.

Esistono diversi modi per poterlo fare e in questo articolo imparerai tre differenti tecniche usate per trovare l'indice di un elemento in una lista in Python.

Le tre tecniche sono:

  • trovare l'indice usando il metodo per lista index(),
  • usando un loop for,
  • e infine, usando una comprensione di lista e la funzione enumerate().

In modo specifico, ecco quello che tratteremo nel dettaglio:

  1. Una panoramica sulle liste in Python
    1.1 Come funzionano gli indici
  2. Usare il metodo index() pre trovare l'indice di un elemento
    2.1 Usare i parametri opzionali con il metodo index()
  3. Ottenere gli indici di tutte le ripetizioni di un elemento in una lista
    3.1 Usare un loop forper ottenere tutti gli indici di un elemento ripetuto
    3.2 Usare una comprensione di lista e la funzione enumerate() per ottenere tutti gli indici di un elemento ripetuto

Cosa sono le liste in Python?

Le liste sono dei tipi di dato integrati in Python e delle strutture di dati tra le più versatili.

Agiscono come contenitori e contengono valori multipli, generalmente correlati; elementi sotto lo stesso nome di variabile.

Gli elementi sono racchiusi all'interno di parentesi quadre, []. Ogni elemento all'interno delle parentesi quadre è separato da una virgola, ,.

# una lista chiamata 'my_information' che contiene stringhe e numeri
my_information = ["John Doe", 34, "London", 1.76]

Dall'esempio qui sopra puoi vedere che le liste possono contenere elementi di qualsiasi tipo di dato, ovvero gli elementi di una lista possono essere eterogenei.

A differenza degli array che possono contenere solo elementi dello stesso tipo, le liste consentono più flessibilità.

Inoltre, le liste sono mutabili, che vuol dire che sono modificabili e dinamiche. Gli elementi di una lista possono essere aggiornati, nuovi elementi possono essere aggiunti e ogni elemento può essere rimosso in qualsiasi momento durante la vita del programma.

Una panoramica sugli indici in Python

Come menzionato, le liste sono insiemi di elementi. In modo specifico, sono insiemi ordinati di elementi che generalmente mantengono l'ordine definito.

Ogni elemento all'interno di una lista ha una posizione univoca che lo identifica.

Questa posizione è chiamata indice.

In Python e nei linguaggi di programmazione in generale, gli indici partono da 0 e non da 1.

Diamo un'occhiata alla lista usata nella sezione precedente:

my_information = ["John Doe", 34, "London", 1.76]

Come detto, gli elementi della lista partono dall'indice 0.

Il primo elemento della lista, "John Doe", ha l'indice 0.
Il secondo elemento della lista, 34, ha l'indice 1.
Il terzo elemento della lista, "London", ha l'indice 2.
Il quarto elemento della lista, 1.76, ha l'indice 3.

Gli indici sono utili per accedere a specifici elementi di una lista la cui posizione (indice) è nota.

Dunque, puoi fare riferimento all'elemento che desideri in una lista usando il suo indice.

Per accedere a un elemento, occorre usare il nome della lista, includendo tra parentesi quadre l'intero che corrisponde all'indice dell'elemento in questione.

Ecco come accedere a ogni elemento usando l'indice corrispondente:

my_information = ["John Doe", 34, "London", 1.76]

print(my_information[0])
print(my_information[1])
print(my_information[2])
print(my_information[3])

#output

#John Doe
#34
#London
#1.76

E se invece volessimo trovare l'indice di un elemento in una lista in Python?

Nelle seguenti sezioni vedrai alcuni modi in cui puoi trovare l'indice degli elementi di una lista.

Trovare l'indice di un elemento usando il metodo per liste index() in Python

Finora abbiamo visto come accedere a un valore facendo riferimento al suo indice numerico.

Cosa accade quando non conosci l'indice numerico e stai lavorando con una lista molto estesa?

Puoi fornire un valore e trovare il suo indice, trovando in questo modo la posizione che occupa nella lista.

A questo scopo, puoi usare il metodo integrato di Python index() come strumento di ricerca.

La sintassi del metodo index() è la seguente:

lista.index(elemento, inizio, fine)

Analizziamola nel dettaglio:

  • lista è il nome della lista in cui cercare.
  • .index() è il metodo di ricerca che accetta tre parametri. Un parametro è obbligatorio e gli altri due sono opzionali.
  • elemento è il parametro obbligatorio. È l'elemento di cui trovare l'indice.
  • inizio è il primo parametro opzionale. È l'indice da cui avviare la ricerca.
  • fine è il secondo parametro opzionale. È l'indice in cui terminare la ricerca.

Vediamo un esempio usando solo il parametro obbligatorio:

programming_languages = ["JavaScript","Python","Java","C++"]

print(programming_languages.index("Python"))

#output
#1

Nell'esempio qui sopra, il metodo index() prende solo un argomento, che è l'elemento di cui stiamo cercando l'indice.

Tieni a mente che l'argomento passato è case-sensitive. Ciò vuol dire che se scrivi "python" e non "Python", otterrai un errore, dato che "python" con la "p" minuscola non fa parte della lista.

Il valore restituito è un intero, corrispondente all'indice numerico dell'elemento di lista passato al metodo come argomento.

Ecco un altro esempio:

programming_languages = ["JavaScript","Python","Java","C++"]

print(programming_languages.index("React"))

#output
#line 3, in <module>
#    print(programming_languages.index("React"))
#ValueError: 'React' is not in list

Se provi a cercare un elemento per cui non c'è corrispondenza nella lista, Python darà un errore come valore di ritorno – in modo specifico, restituirà ValueError.

Questo vuol dire che l'elemento che stai cercando non è presente nella lista.

Un modo per evitare che questo accada è racchiudere la chiamata del metodo index() in un blocco try/except.

Se il valore non esiste, ci sarà un messaggio sulla console che dice che il valore non è memorizzato nella lista e quindi non esiste.

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

try:
    print(programming_languages.index("React"))
except ValueError:
    print("That item does not exist")
    
#output
#That item does not exist

Un altro modo è verificare prima se l'elemento è nella lista e poi cercare il suo indice. L'output sarà un valore booleano – True o False.

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print("React" in programming_languages)

#output
#False

Come usare i parametri opzionali con il metodo index()

Diamo un'occhiata al seguente esempio:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages.index("Python"))

#output
#1

Nella lista programming_languages ci sono tre istanze della stringa "Python", che sta venendo cercata.

Come prova, dato che la lista è piccola, in questo caso potresti lavorare a ritroso.

Potresti contare e trovare gli indici numerici e poi farvi riferimento come abbiamo visto nelle sezioni precedenti:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages[1])
print(programming_languages[3])
print(programming_languages[5])

#output
#Python
#Python
#Python

C'è n'è una in posizione 1, un'altra in posizine 3 e l'ultima in posizione 5.

Perché non vengono mostrate quando viene usato il metodo index()?

Questo avviene perché il valore restituito dal metodo index() corrisponde alla prima presenza di un elemento nella lista. I valori successivi non vengono considerati.

Il metodo index() restituisce soltanto l'indice corrispondente alla posizione in cui l'elemento appare la prima volta.

Puoi provare a passare i parametri opzionali inizio e fine al metodo index().

Sai già che la stringa è presente la prima volta all'indice 1, quindi questo potrebbe essere il valore del parametro inizio.

Per il parametro fine puoi iniziare con la lunghezza della lista.

Per trovare la lunghezza, usa la funzione len():

print(len(programming_languages)) 

#output is 6

Il valore del parametro fine dovrà essere il valore della lunghezza della lista meno 1. L'indice dell'ultimo elemento di una lista è sempre minore di uno rispetto alla lunghezza della lista.

Mettendo tutto insieme, ecco come puoi provare a ottenere tutte e tre le istanze dell'elemento:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages.index("Python",1,5))

#output
#1

L'output è ancora la prima istanza!

I parametri inizio e fine definiscono un intervallo di posizioni per la ricerca e il valore restituito dal metodo index() corrisponde alla prima volta che l'elemento è presente nella lista all'interno dell'intervallo indicato.

Come ottenere gli indici di tutte le ripetizioni di un elemento in una lista

Usare un loop for per ottenere tutte le ripetizioni di un elemento in una lista

Prendiamo lo stesso esempio che abbiamo usato finora, in cui la stringa "Python" è presente tre volte nella lista.

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

Iniziamo creando una nuova lista vuota.

Questa sarà la lista in cui saranno conservati tutti gli indici di "Python".

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

Poi usiamo un loop for per iterare sulla lista e ottenere ogni elemento della lista originale. In modo specifico, iteriamo sull'indice di ogni elemento.

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

for programming_language in range(len(programming_languages)):

Occorre usare la  parola chiave for.

E poi creare una variabile, in questo caso programming_language, che agirà come segnaposto per la posizione di ogni elemento della lista originale durante il processo di iterazione.

In seguito, bisogna specificare le iterazioni che il loop for dovrà eseguire.

In questo caso, il loop itererà su tutte la lunghezza della lista, dall'inizio alle fine. La sintassi range(len(programming_languages)) è un modo per accedere a tutti gli elementi della lista programming_languages.

La funzione range() accetta una sequenza di numeri che specificano il numero dal quale iniziare e quello a cui finire il conteggio.

La funzione len() calcola la lunghezza della lista, quindi in questo caso il conteggio parte da 0 e termina a 6 (non incluso), che è la fine della lista.

Infine, occorre impostare una condizione logica.

Essenzialmente, quello che vogliamo fare è: "se durante l'iterazione il valore a una data posizione è uguale a 'Python', aggiungi la posizione nella nuova lista creata precedentemente".

Per aggiungere un elemento alla lista usiamo il metodo append().

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

for programming_language in range(len(programming_languages)):
    if programming_languages[programming_language] == "Python":
      python_indices.append(programming_language)

print(python_indices)

#output

#[1, 3, 5]

Usare una comprensione di lista e la funzione enumerate() per ottenere tutte le ripetizioni di un elemento in una lista

Un altro modo per trovare gli indici di tutte le ripetizioni di un particolare elemento è usare una comprensione di lista.

La comprensione di lista è un modo per creare una nuova lista in base a una esistente.

Ecco come puoi ottenere tutti gli indici della stringa "Python", usando una comprensione di lista:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices  = [indice for (indice, elemento) in enumerate(programming_languages) if elemento == "Python"]

print(python_indices)

#[1, 3, 5]

Con la funzione enumerate() puoi salvare gli indici degli elementi che soddisfano la condizione definita.

Occorre prima fornire una coppia (indice, elemento) per ogni elemento nella lista (programming_languages) come argomento della funzione.

indice è l'indice numerico dell'elemento della lista e elemento è l'elemento stesso.

Agisce come contatore, partendo da 0 e incrementando ogni volta che la condizione stabilita viene soddisfatta, selezionando e spostando gli indici degli elementi che corrispondono al criterio.

Accoppiata alla comprensione di lista, consente di creare una nuova lista con tutti gli indici della stringa "Python".

Conclusione

Ed ecco fatto! Adesso conosci alcuni modi per trovare l'indice di un elemento, anche nel caso sia presente più volte in una lista in Python.

Spero tu abbia trovato utile questo articolo.

Se vuoi saperne di più su Python, dai un'occhiata alla certificazione di freeCodeCamp Calcolo Scientifico con Python.

Partirai dalle basi e imparerai in un modo interattivo e adatto ai principianti. Alla fine dovrai anche creare cinque progetti per mettere in pratica e consolidare quello che hai imparato.

Grazie per aver letto e buona programmazione!