Encontrar el índice de un elemento dada una lista que lo contiene en Python

Para una lista ["foo", "bar", "baz"] y un elemento de la lista `"bar", ¿cómo obtengo su índice (1) en Python?

Solución
>>> ["foo", "bar", "baz"].index("bar")
1

Referencia: Estructuras de datos > Más sobre listas

Las advertencias siguen

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.

Complejidad temporal lineal en la longitud de la lista

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

Sólo devuelve el índice de la primera coincidencia con su argumento

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.

Lanza si el elemento no está presente en la lista

Una llamada a index resulta en un ValueError si el elemento no está presente.

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: 2 is not in list

Si el elemento puede no estar presente en la lista, debe

  1. Buscarlo primero con item in my_list (enfoque limpio y legible), o
  2. Envolver la llamada a index 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).
Comentarios (2)

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.

Comentarios (1)

¡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"])
Comentarios (3)