Corso
In Python, una struttura dati ti aiuta a organizzare e archiviare i dati in modo efficiente. Una struttura comune e versatile è la lista, che può contenere diversi tipi di dati in un ordine specifico. Python fornisce anche molte funzioni o metodi per lavorare con le liste.
In questo tutorial, imparerai la funzione index() di Python. Il metodo index() cerca un elemento nella lista e ne restituisce la posizione/indice. Per prima cosa, questo tutorial ti introdurrà alle liste, poi vedrai alcuni semplici esempi su come lavorare con la funzione index().
Per eseguire facilmente tu stesso tutto il codice di esempio in questo tutorial, puoi creare gratuitamente un workbook DataLab con Python preinstallato e contenente tutti gli esempi di codice.
Che cos'è l'indexing in Python?
In Python, indexing indica il processo di accesso a un elemento specifico in una sequenza, come una stringa o una lista, usando la sua posizione o numero di indice. L'indicizzazione in Python parte da 0, il che significa che il primo elemento di una sequenza ha indice 0, il secondo ha indice 1 e così via. Ad esempio, se abbiamo la stringa "Hello", possiamo accedere alla prima lettera "H" usando l'indice 0 con la notazione tra parentesi quadre: string[0].
La funzione integrata di Python index() è utile per trovare l'indice di un elemento specifico in una sequenza. Questa funzione accetta un argomento che rappresenta il valore da cercare e restituisce l'indice della prima occorrenza di quel valore nella sequenza.
Se il valore non viene trovato nella sequenza, la funzione solleva un ValueError. Ad esempio, se abbiamo una lista [1, 2, 3, 4, 5], possiamo trovare l'indice del valore 3 chiamando list.index(3), che restituirà il valore 2 (dato che 3 è il terzo elemento della lista e l'indicizzazione parte da 0).
La funzione index() è uno strumento potente in Python perché semplifica la ricerca dell'indice di un elemento in una sequenza, eliminando la necessità di scrivere loop o istruzioni condizionali. Questa funzione è particolarmente utile quando si lavora con dataset di grandi dimensioni o strutture complesse, dove la ricerca manuale potrebbe richiedere molto tempo ed essere soggetta a errori.
Che cos'è la funzione index()?
Il metodo index() restituisce l'indice più basso nella lista in cui compare l'elemento cercato.
Proviamolo:
list_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
element = 3
print(list_numbers.index(element)) # 2
Se si cerca un elemento che non è presente, viene generato un ValueError.
list_numbers = [4, 5, 6, 7, 8, 9, 10]
element = 3 # Not in the list
print(list_numbers.index(element)) # Throws a ValueError
Lavorare con le stringhe
Proviamo con elementi stringa:
list_numbers = [1, 'two', 3, 4, 5, 6, 7, 8, 9, 10]
element = 'two'
print(list_numbers.index(element)) # 1
Nota: Quando cerchi stringhe, index() fa distinzione tra maiuscole e minuscole. Ad esempio, 'Hello'.index('h') solleverà un ValueError.
Trovare la prima occorrenza
Immagina di avere più istanze di un elemento: in tal caso, index() ti restituirà la prima posizione in cui l'elemento compare.
list_numbers = [3, 1, 2, 3, 3, 4, 5, 6, 3, 7, 8, 9, 10]
element = 3
print(list_numbers.index(element)) # 0
La posizione restituita è 0, perché 3 compare per la prima volta in prima posizione, cioè all'indice 0 in Python.
Ecco cosa succede internamente: l'indice scorre tutti i valori a partire dalla prima posizione (indice 0), cercando l'elemento che stai cercando. Quando trova il valore, ne restituisce la posizione ed esce. Tuttavia, questo non è molto efficiente quando si scorre una lista grande e ti serve la posizione di qualcosa verso la fine.
Uso dei parametri start e stop
list_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
element = 7
print(list_numbers.index(element, 5, 8)) # 6
Quindi la sintassi è: list_name.index(element, start, stop).
Qui i valori start e stop sono opzionali. In effetti, usali solo quando sei del tutto sicuro dell'intervallo; altrimenti otterrai un ValueError, come mostrato sotto.
list_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
element = 7
print(list_numbers.index(element, 1, 5)) # Throws a ValueError
Trovare tutte le occorrenze
Poiché index() restituisce solo la prima corrispondenza di un oggetto, puoi usare una list comprehension, o un'espressione generatrice, se ti servono le posizioni di più corrispondenze nella lista. Ecco come:
list_numbers = [3, 1, 2, 3, 3, 4, 5, 6, 3, 7, 8, 9, 10]
# List comprehension
print([i for i, n in enumerate(list_numbers) if n == 3]) # [0, 3, 4, 8]
list_numbers = [3, 1, 2, 3, 3, 4, 5, 6, 3, 7, 8, 9, 10]
g = (i for i, n in enumerate(list_numbers) if n == 3) # Generator expression
print("Generators store values, the first value here is:", next(g), ". Then the next is:", next(g), "followed by ", next(g),"and finally ", next(g))
# Generators store values, the first value here is: 0. Then the next is: 3 followed by 4 and finally 8
I generatori sono efficienti in termini di memoria perché producono gli elementi uno alla volta invece di memorizzare tutti i risultati come fanno le list comprehension.
Considerazioni finali
Complimenti, hai appena imparato la funzione index() in Python! Hai visto come può aiutarti a lavorare con le liste. Sei stato anche introdotto ad alcuni concetti nuovi. Per approfondire le list comprehension, dai un'occhiata al tutorial di DataCamp Python List Comprehension. Il Python Iterator Tutorial di DataCamp approfondisce generatori ed espressioni generatrici.
Ho lavorato in diversi settori e ho ricoperto vari ruoli: sviluppatore software, ricercatore di machine learning, data scientist, product manager. Ma, soprattutto, sono un programmatore a cui piace imparare e condividere conoscenza!
FAQs
Cosa succede se più valori corrispondono all'elemento che sto cercando?
Il metodo index() restituisce solo l'indice della prima occorrenza dell'elemento corrispondente. Se ti servono tutte le posizioni, usa una list comprehension con enumerate().
Posso usare index() con tuple o stringhe?
Sì! Il metodo index() funziona con qualsiasi tipo di sequenza, incluse tuple e stringhe:
my_tuple = (1, 2, 3, 2)
print(my_tuple.index(2)) # Output: 1
text = "hello world"
print(text.index('o')) # Output: 4C'è un modo per gestire ValueError in modo elegante?
Sì, incapsula la chiamata a index() in un blocco try...except per evitare arresti se l'elemento non viene trovato:
my_list = [1, 2, 3]
try:
print(my_list.index(4))
except ValueError:
print("Element not found.")
Come posso cercare dalla fine della lista?
Il metodo index() non supporta la ricerca al contrario. Per trovare l'ultima occorrenza, inverti manualmente la lista o usa una comprehension:
my_list = [1, 2, 3, 2, 1]
last_index = len(my_list) - 1 - my_list[::-1].index(2)
print(last_index) # Output: 3
In cosa index() è diverso da find()?
Il metodo find() si usa con le stringhe e restituisce -1 invece di sollevare un errore quando il valore non viene trovato. Le liste non hanno un metodo find().
text = "hello"
print(text.find('e')) # Output: 1
print(text.find('z')) # Output: -1
Posso usare index() con liste annidate?
Sì, ma solo al livello superiore. index() non cerca all'interno di strutture annidate.
nested_list = [[1, 2], [3, 4]]
print(nested_list.index([3, 4])) # Output: 1
# This won't work: nested_list.index(3)
Cos'è l'errore "list index out of range"?
L'errore "list index out of range" si verifica quando provi ad accedere a un indice fuori dall'intervallo degli indici validi per una lista. Ad esempio, se una lista ha 5 elementi, gli indici validi sono da 0 a 4. Se provi ad accedere a un indice maggiore o uguale a 5, otterrai questo errore.
Per evitare l'errore "list index out of range", assicurati che l'indice a cui stai tentando di accedere rientri nell'intervallo degli indici validi per la lista. Puoi usare la funzione len() per ottenere la lunghezza di una lista e verificare se un indice è valido.
Cos'è l'errore "list indices must be integers"?
L'errore "list indices must be integers" si verifica quando provi a usare un valore non intero come indice di una lista. Ad esempio, se provi a usare un numero in virgola mobile o una stringa come indice di una lista, otterrai questo errore.
Per evitare l'errore "list indices must be integers", assicurati di usare un valore intero come indice della lista. Se ti serve usare un valore non intero come indice, puoi convertirlo in intero usando la funzione int().


