Per una lista ["foo", "bar", "baz"]
e un elemento nella lista "bar"
, come posso ottenere il suo indice (1) in Python?
>>> ["foo", "bar", "baz"].index("bar")
1
Riferimento: Data Structures > More on Lists
Si noti che mentre questo è forse il modo più pulito per rispondere alla domanda come richiesto, index
è un componente piuttosto debole dell'API list
, e non riesco a ricordare l'ultima volta che l'ho usato con rabbia. Mi è stato fatto notare nei commenti che, poiché questa risposta è pesantemente referenziata, dovrebbe essere resa più completa. Seguono alcune avvertenze su list.index
. Probabilmente vale la pena dare inizialmente un'occhiata alla docstring per esso:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Una chiamata index
controlla ogni elemento della lista in ordine, finché non trova una corrispondenza. Se la vostra lista è lunga, e non sapete approssimativamente in quale punto della lista si verifica, questa ricerca potrebbe diventare un collo di bottiglia. In tal caso, dovreste considerare una struttura dati diversa. Nota che se sai approssimativamente dove trovare la corrispondenza, puoi dare un suggerimento a index
. Per esempio, in questo frammento, l.index(999_999, 999_990, 1_000_000)
è circa cinque ordini di grandezza più veloce di l.index(999_999)
, perché il primo deve cercare solo 10 voci, mentre il secondo ne cerca un milione:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
Una chiamata a index
cerca attraverso la lista in ordine fino a quando non trova una corrispondenza, e si ferma lì. Se ci si aspetta di aver bisogno degli indici di più corrispondenze, si dovrebbe usare una comprensione della lista o un'espressione generatrice.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
Nella maggior parte dei posti in cui una volta avrei usato index
, ora uso una comprensione di lista o un'espressione generatrice perché sono più generalizzabili. Quindi, se state pensando di usare index
, date un'occhiata a queste eccellenti caratteristiche di python.
Una chiamata a index
provoca un ValueError
se l'elemento non è presente.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Se l'elemento potrebbe non essere presente nella lista, si dovrebbe
item in my_list
(approccio pulito e leggibile), oppureindex
in un blocco try/except
che cattura ValueError
(probabilmente più veloce, almeno quando la lista da cercare è lunga, e l'elemento è solitamente presente).Una cosa che è veramente utile per imparare Python è usare la funzione di aiuto interattivo:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
che spesso vi porterà al metodo che state cercando.
index()
restituisce il primo indice del valore!
indice(...)
| L.index(value, [start, [stop]]) -> integer -- restituisce il primo indice del valore
def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices
all_indices("foo", ["foo","bar","baz","foo"])