Para una lista ["foo", "bar", "baz"]
y un elemento de la lista `"bar", ¿cómo obtengo su índice (1) en Python?
>>> ["foo", "bar", "baz"].index("bar")
1
Referencia: Estructuras de datos > Más sobre listas
Ten en cuenta que, aunque esta es quizás la forma más limpia de responder a la pregunta tal y como se ha formulado, index
es un componente bastante débil de la API de listas
, y no recuerdo la última vez que lo usé con rabia. Me han señalado en los comentarios que, dado que esta respuesta está muy referenciada, debería ser más completa. Siguen algunas advertencias sobre list.index
. Probablemente merezca la pena echar un vistazo al docstring de la misma:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Una llamada a index
comprueba cada elemento de la lista en orden, hasta que encuentra una coincidencia. Si tu lista es larga, y no sabes aproximadamente en qué parte de la lista ocurre, esta búsqueda podría convertirse en un cuello de botella. En ese caso, debería considerar una estructura de datos diferente. Tenga en cuenta que si sabe más o menos dónde encontrar la coincidencia, puede dar a index
una pista. Por ejemplo, en este fragmento, l.index(999_999, 999_990, 1_000_000)
es aproximadamente cinco órdenes de magnitud más rápido que l.index(999_999)
, porque el primero sólo tiene que buscar en 10 entradas, mientras que el segundo busca en un millón:
>>> 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 llamada a index
busca a través de la lista en orden hasta que encuentra una coincidencia, y se detiene allí. Si espera necesitar índices de más coincidencias, debe utilizar una comprensión de lista, o una expresión generadora.
>>> [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
La mayoría de los lugares donde una vez habría utilizado index
, ahora uso una comprensión de lista o expresión generadora porque son más generalizables. Así que si estás considerando usar index
, echa un vistazo a estas excelentes características de python.
Una llamada a index
resulta en un ValueError
si el elemento no está presente.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Si el elemento puede no estar presente en la lista, debe
item in my_list
(enfoque limpio y legible), oindex
en un bloque try/except
que capture ValueError
(probablemente más rápido, al menos cuando la lista a buscar es larga, y el elemento suele estar presente).Una cosa que es realmente útil en el aprendizaje de Python es utilizar la función de ayuda interactiva:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
que a menudo te llevará al método que estás buscando.
¡index()
devuelve el primer índice del valor!
| index(...) | L.index(value, [start, [stop]]) -> integer -- devuelve el primer índice del valor
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"])