Come trovare l’indice di un elemento negli elenchi Python

In questa guida imparerai come trovare l’indice di un elemento in una lista Python, usando sia iterazioni semplici che un metodo list integrato index().

Quando si lavora con gli elenchi Python, potrebbe essere necessario scoprire l’indice in cui si trova un particolare elemento. Puoi farlo:

  • Scorrere l’elenco e verificare se l’elemento all’indice corrente è uguale al valore particolare
  • Utilizzo del metodo di elenco integrato index()

Imparerai entrambe le cose sopra in questo tutorial. Cominciamo.👩🏽‍💻

Elenchi Python, rivisitati

In Python, un elenco è una raccolta di elementi, dello stesso tipo o di tipi di dati diversi. Sono mutevoli; puoi modificarli sul posto senza dover creare un nuovo elenco.

Considera questo esempio frutti: un elenco di 5 frutti diversi.

fruits = ["apple","mango","strawberry","pomegranate","melon"]

Puoi ottenere la lunghezza di qualsiasi oggetto Python usando la funzione len() incorporata. Quindi puoi chiamare la funzione len() con l’oggetto list (fruits) come argomento per ottenere la sua lunghezza, come mostrato di seguito.

len(fruits)
# Output: 5

Useremo l’elenco dei frutti come esempio in esecuzione in questo tutorial.

Indicizzazione negli elenchi Python

Python segue l’indicizzazione zero. Quindi, in qualsiasi iterabile Python, il primo elemento è all’indice 0, il secondo elemento è all’indice 1 e così via. Se la lunghezza dell’iterabile è k, l’ultimo elemento è all’indice k – 1.

In Python, puoi usare la funzione range() per ottenere indici mentre esegui il ciclo degli iterabili.

Nota: quando si scorre range(k), si ottengono gli indici 0,1,2,…,(k-1). Quindi impostando k = len(list), puoi ottenere l’elenco di tutti gli indici validi.

La seguente cella di codice spiega questo.

for i in range(len(fruits)):
  print(f"i:{i}, fruit[{i}] is {fruits[i]}")

# Output
i:0, fruit[0] is apple
i:1, fruit[1] is mango
i:2, fruit[2] is strawberry
i:3, fruit[3] is pomegranate
i:4, fruit[4] is melon

Ora che abbiamo trattato le basi delle liste Python, impariamo come trovare l’indice di un elemento in una lista.

Trova l’indice di un elemento dell’elenco per iterazione utilizzando i cicli for

Consideriamo l’elenco dei frutti della sezione precedente. Impareremo come trovare l’indice di un elemento specifico in questo elenco mediante l’iterazione utilizzando il ciclo for.

Utilizzo della funzione for Loop e range()

Fissiamo target: il valore che stiamo cercando nell’elenco.

È possibile utilizzare la funzione for loop e range() per ottenere l’elenco degli indici da 0 a len(fruits) – 1.

  • Scorri l’elenco dei frutti accedendo a ciascun indice.
  • Controlla se l’elemento all’indice corrente i è uguale al target.
  • Se True, stampa che il target è stato trovato all’indice i.
fruits = ["apple","mango","strawberry","pomegranate","melon"]

target = "mango"

for i in range(len(fruits)):
  if fruits[i] == target:
   print(f"{target} found at index {i}")

# Output
mango found at index 1

In questo esempio, la stringa di destinazione ‘mango’ appare esattamente una volta (all’indice 1) nella lista dei frutti.

Tuttavia, a volte il valore target appare più di una volta o non compare affatto. Per gestire questi casi, modifichiamo il ciclo precedente e avvolgiamo il contenuto all’interno di una funzione chiamata find_in_list.

Comprendere la definizione di funzione

La funzione find_in_list ha due parametri:

  • target: il valore che stai cercando, e
  • py_list: l’elenco Python che stai cercando.
def find_in_list(target,py_list):
  target_indices = []
  for i in range(len(fruits)):
    if fruits[i] == target:
      target_indices.append(i)  
  if target_indices == []:
    print("Sorry, target not found!")
  else:
    print(f"{target} is found at indices {target_indices}")

Nel corpo della funzione, inizializziamo una lista vuota target_indices. Scorriamo l’elenco e accediamo agli elementi dell’elenco. Se il target è stato trovato in un determinato indice, aggiungiamo quell’indice all’elenco target_indices usando il metodo append().

Nota: in Python, list.append(item) aggiunge un elemento alla fine dell’elenco.

  • Se il target non viene mai trovato, target_indices è un elenco vuoto; l’utente viene informato che il target non è presente nell’elenco.
  • Se il target viene trovato in più di un indice, target_indices contiene tutti quegli indici.

Quindi, ridefiniamo l’elenco dei frutti come mostrato.

Questa volta stiamo cercando la stringa di destinazione ‘mango’, che ricorre due volte, agli indici 1 e 4.

fruits = ["apple","mango","strawberry","pomegranate","mango","melon"]
target = "mango"
find_in_list(target,fruits)

# Output
mango is found at indices [1, 4]

Chiamando la funzione find_in_list con target e fruits come argomenti, vediamo che vengono restituiti entrambi gli indici.

target = "turnip"
find_in_list(target,fruits)

# Output
Sorry, target not found!

Se provi a cercare ‘rape’ che non è presente nell’elenco dei frutti, ricevi un messaggio che indica che il bersaglio non è stato trovato.

Utilizzo della funzione for Loop ed enumerate()

In Python, puoi usare la funzione enumerate() per accedere sia all’indice che agli elementi contemporaneamente, senza dover usare la funzione range().

La cella di codice seguente mostra come utilizzare la funzione enumerate() per ottenere sia gli indici che gli elementi.

fruits = ["apple","mango","strawberry","pomegranate","mango","melon"]
for index,fruit in enumerate(fruits):
  print(f"Index {index}: {fruit}")

# Output
Index 0: apple
Index 1: mango
Index 2: strawberry
Index 3: pomegranate
Index 4: mango
Index 5: melon

Ora, riscriviamo la funzione Python per trovare l’indice degli elementi nell’elenco usando la funzione enumerate().

def find_in_list(target,py_list):
  target_indices = []
  for index, fruit in enumerate(fruits):
   if fruit == target:
    target_indices.append(index) 
  if target_indices == []:
    print("Sorry, target not found!")
  else:
    print(f"{target} is found at indices {target_indices}")

Come per la sezione precedente, ora puoi chiamare la funzione find_in_list con argomenti validi.

Puoi tradurre la definizione di funzione sopra in una comprensione di elenco equivalente e lo faremo nella prossima sezione.

Trova l’indice di un elemento dell’elenco per iterazione utilizzando la comprensione dell’elenco

La comprensione degli elenchi in Python ti consente di creare elenchi da elenchi esistenti in base a determinate condizioni. Ecco il costrutto generale:

new_list = [<output> for <items in existing iterables> if <condition is true>] 

La figura seguente descrive come identificare gli elementi di comprensione dell’elenco; usando questo, puoi convertire la funzione find_in_list in una comprensione dell’elenco.

Usando quanto sopra, l’espressione per la comprensione dell’elenco per creare indici di destinazione è la seguente.

target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]

Come esercizio, puoi provare a eseguire lo snippet di codice sopra per alcuni altri esempi.

Trova l’indice di una voce di elenco utilizzando il metodo index()

Per trovare l’indice di un elemento in un elenco Python, puoi anche usare il metodo integrato .index(). Ecco la sintassi generale:

list.index(value,start,end)

Analizzando il metodo sopra:

  • value è il valore target che stai cercando.
  • inizio e fine sono argomenti posizionali opzionali; puoi usarli per cercare trovare l’indice di un elemento nella sezione dell’elenco a partire dall’inizio e estendersi fino alla fine – 1.

Nota: il metodo .index() restituisce solo l’indice della prima occorrenza di valore nell’elenco. Anche quando trovi l’indice di un elemento in una sezione dell’elenco [start: end-1]questo metodo restituisce solo l’indice corrispondente alla prima occorrenza dell’elemento.

Rivisitiamo il nostro esempio per capire come funziona il metodo .index().

fruits = ["apple","mango","strawberry","pomegranate","mango","melon"]
target = "mango"

fruits.index(target)
1

Anche se ci sono due occorrenze di ‘mango’ nell’elenco dei frutti, puoi vedere che è stato restituito solo l’indice della prima occorrenza.

Per ottenere l’indice della seconda occorrenza di mango, possiamo cercare nella sezione dell’elenco a partire dall’indice 2 e estendersi fino all’indice 5, come mostrato di seguito.

fruits.index(target,2,5)
4

Come gestire gli errori di valore in Python

Ora vediamo cosa succede se provi a trovare l’indice di un elemento che non è presente nell’elenco, ad esempio ‘carota’.

target = "carrot"

fruits.index(target)

# Output
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-81bd454e44f7> in <module>()
      1 target = "carrot"
      2 
----> 3 fruits.index(target)

ValueError: 'carrot' is not in list

Come visto nella cella di codice sopra, questo genera a ValueError. In Python, puoi gestirlo come un’eccezione usando i blocchi try ed exclude.

La sintassi generale per utilizzare try-exception è la seguente.

try:
  # to do this
except <ErrorType>:
  # do this to handle <ErrorType> as exception

Usando i blocchi try-except sopra, possiamo gestire ValueError come un’eccezione.

target = "carrot"
try:
  fruits.index(target)
except ValueError:
  print(f"Sorry, could not find {target} in list")

# Output
Sorry, could not find carrot in list

Il codice sopra fa quanto segue:

  • Se il target è presente nell’elenco, restituisce l’indice del target.
  • Se la destinazione non è presente, gestisce ValueError come eccezione e stampa il messaggio di errore.

Riassumendo

Ecco un riepilogo dei diversi metodi che hai imparato per trovare l’indice di un elemento in un elenco Python.

  • È possibile utilizzare la funzione for loop e range() di Python per ottenere gli elementi e i rispettivi indici. Controlla se gli elementi degli indici corrispondono al target.
  • È inoltre possibile utilizzare la funzione enumerate() per accedere contemporaneamente all’elemento e all’indice.
  • È possibile utilizzare entrambi i metodi precedenti all’interno di un’espressione di comprensione dell’elenco.
  • Per trovare l’indice di un elemento in un elenco, puoi anche utilizzare il metodo integrato .index().
  • list.index(value) restituisce l’indice della prima occorrenza di value in list. Se il valore non è presente, genera un ValueError.
  • Puoi cercare in una determinata sezione dell’elenco utilizzando list.index(value, start, end) per cercare l’occorrenza di un valore nella sezione dell’elenco [start:end-1].

Quindi, impara a ordinare un dizionario Python per chiave o per valore. Buona programmazione Python!