Saltar al contenido

Encontrar el Índice de un Elemento en una Lista en Python

Cómo encontrar la posición de un elemento en una lista en Python

¿Cómo puedo encontrar la posición de un elemento en una lista de Python? Esta es una pregunta recurrente y muy frecuente y de las primeras que surgen cuando empezamos a aprender el lenguaje y a trabajar con listas.

Para encontrar el índice de un elemento de una lista o una tupla en Python usamos la función index que devuelve la posición de la primera aparición del elemento. Para obtener todos los índices hacemos [i for i, e in enumerate(lista) if e == elemento]. También se puede usar la función where de NumPy.

Pero vamos a verlo paso a paso, que en el párrafo de arriba hay demasiada información junta.

Primero voy a aclarar que las palabras índice o posición se usan aquí indistintamente y significan lo mismo.

¡Importante! Recuerda que los índices de las colecciones en Python, así como en C o en Java, por ejemplo, empiezan a contar en 0. Es decir, si una lista tiene 10 elementos, el primer elemento tendrá de índice o posición 0 y el último tendrá 9.

Es interesante tener en cuenta que todas las explicaciones de este artículo sirven tanto si tenemos los elementos en una lista (corchetes []) o en una tupla (paréntesis ()). Si tienes alguna duda, revisa aquí el uso de los paréntesis y corchetes en Python.

La función index de list en Python

La función index, que es un método de la clase list, nos permite obtener el índice o posición de la primera aparición de un elemento dentro de una lista. Esto quiere decir que si el elemento está repetido en dicha lista no vamos a poder obtener los índices de las repeticiones con esta función. Pero de este problema nos encargaremos más tarde.

Si invocamos la ayuda de la función desde una consola de Python mediante la llamada help(list.index) obtenemos lo siguiente:

index(self, value, start=0, stop=9223372036854775807, /)
    Return first index of value.
    
    Raises ValueError if the value is not present.

Si nos fijamos, la función, además de la propia lista (self), necesita tres parámetros diferentes:

  1. value, que es el elemento cuyo índice queremos conocer.
  2. start, que indica la posición en la que empezar a buscar dentro de la lista. Por defecto toma el valor 0, es decir, que si no indicamos este parámetro la búsqueda del elemento comenzará al principio de la lista.
  3. stop, que indica la posición en la que se detendrá la búsqueda. Por defecto toma el valor máximo de elementos que puede contener una lista (que como vemos, ¡es enorme!). Con este valor por defecto, si no indicamos otro, la búsqueda siempre se hará hasta el final de cualquier lista con independencia de su tamaño.

De esta manera, el único parámetro obligatorio que tenemos que indicar, y como es lógico, es el valor del elemento que queremos encontrar. Si quisieras limitar la búsqueda a una porción concreta de la lista, podrías hacerlo por medio de los otros dos parámetros.

15 conceptos fundamentales que necesitas conocer para aprender y dominar Python

Te voy a hacer dos regalos (no uno, sino dos) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python y una cheat sheet de Python en español: La Hoja de Referencia de Python.

Estos regalos son exclusivos para los suscriptores de Código Pitón.

👍 Quiero suscribirme y mis dos regalos

Veamos un ejemplo sin limitar las posiciones de la búsqueda:

>>> lista = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
>>> lista.index(10)
0
>>> lista.index(50)
4
>>> lista.index(100)
9
>>> lista.index(200)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 200 is not in list

Cómo ves, es muy sencillo obtener la posición de un elemento de una lista.

Fíjate en que, si el elemento no existe (como es el caso del 200 en el ejemplo de arriba), Python nos lanza un error ValueError indicándonos además que el valor 200 no se encuentra en la lista.

Vamos a buscar ahora un elemento pero acotando esta vez la búsqueda por medio de los parámetros start y end:

>>> lista = [10, 20, 30, 40, 30, 20, 10]
>>> lista.index(10)
0
>>> lista.index(10, 2)
6
>>> lista.index(10, 2, 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 10 is not in list

Como puedes ver, el 10 está repetido en la lista y en nuestra primera llamada a index obtenemos la posición de la primera aparición, que es 0.

Si después buscamos el 10, pero esta vez indicamos en el segundo parámetro (que es start) que queremos empezar a buscar en la posición 2, index nos devuelve que la posición del elemento 10 es 6, ya que esa es la posición del primer 10 que aparece si empezamos a buscar desde la posición 2.

Finalmente, si acotamos la búsqueda del valor 10 entre las posiciones 2 y 5, obtenemos de nuevo el error ValueError ya que entre esas posiciones no existe ningún 10.

Problemas de la función index y precauciones a tomar

La función index para localizar un elemento dentro de una lista no está exenta de problemas. Los dos más evidentes ya te los he contado:

  1. Solo nos sirve para encontrar la primera aparición de un elemento en una lista. Por tanto, tenemos que buscar una alternativa si necesitamos encontrar todos los elementos (en la próxima sección te cuento un par de maneras de lograrlo, una de ellas muy pythonica).
  2. Si el elemento a localizar no existe, index lanzará el error ValueError con lo que se interrumpirá la ejecución del programa. Tendremos, por tanto, que utilizar un bloque try/except para manejar ese error. Otra opción, aunque algo más lenta, sería comprobar la existencia del elemento previamente con el operador in de esta manera elemento in lista. Te cuento más en otro artículo sobre el operador in usado en cadenas de texto. ¡No dejes de leerlo!

Pero además de estos dos problemas, tenemos alguna cosa más que considerar.

La complejidad en la ejecución de index es lineal, es decir, O(n), pues la búsqueda del elemento se hace de manera secuencial y de izquierda a derecha. Si la lista es muy grande esto puede suponer un problema de eficiencia. De todas maneras, ten en cuenta que se puede acotar la búsqueda por medio de los parámetros start e index, de forma que puedes darle una pista a la función si más o menos sabes en que porción de la lista hay que buscar.

Ten en cuenta que si tienes una lista muy grande y ordenada, es mucho más eficiente ejecutar una búsqueda binaria, por ejemplo, con complejidad O(log n), que utilizar index.

Encontrar todas las posiciones de un elemento en una lista

Vale. Tienes una lista con elementos repetidos. Necesitas todas las posiciones de un elemento en esa lista. No te basta con una llamada a index.

Una posible alternativa es utilizar la comprensión de listas y la clase enumerate y generar una lista con todas las posiciones de un elemento haciendo tú misma (o mismo) la búsqueda. La solución es de esta manera:

>>> lista = [10, 20, 30, 40, 30, 20, 10]
>>> elemento = 20
>>> [indice for indice, dato in enumerate(lista) if dato == elemento]
[1, 5]

Sencillo y muy pythonico al hacer uso de características muy potentes del lenguaje. También tiene la ventaja de que si el elemento no existe en la lista, no vamos a obtener ningún error, tan solo una lista vacía. Por tanto, esta solución resuelve algunos de los problemas comentados previamente.

Te explico cómo utilizar enumerate (entre otras cosas chulas) en el siguiente artículo: cómo recorrer dos listas a la vez en Python.

Te planteo una alternativa más, que no es tan bonita ni tan corta, pero funciona y nos sirve como ilustración de un buen uso del parámetro start y en la cual, además, vemos como utilizar try / except:

lista = [10, 20, 30, 40, 30, 20, 10]
elemento = 30  # elemento a buscar

posiciones = []  # nuestra lista para guardar las posiciones
posicion = -1  # empezaremos a buscar en posicion + 1 (que es 0 inicialmente)

try:
    while True:
        # buscamos empezando a buscar desde la última posición encontrada
        posicion = lista.index(elemento, posicion + 1)
        posiciones.append(posicion)
except:
    pass  # no hacemos nada si index lanza ValueError

print(posiciones)

La idea consiste en encontrar la primera posición del elemento a buscar y después volver a buscar desde esa posición (aquí usamos el parámetro start) incrementando en uno el valor de la posición (para no volver a encontrar el mismo elemento una y otra vez).

Hacemos esto en un bucle hasta que se acabe la lista o hasta que no se encuentre el elemento, momento en el que saltará el error ValueError y se detiene la ejecución del bucle. Finalmente mostramos las posiciones por pantalla.

Recibe contenido exclusivo y obtén gratis la Hoja de Referencia de Python.

Antes de suscribirte consulta aquí la 
Información Básica sobre Protección de Datos. Responsable de datos: Laura Otero Moreira. Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales. Legitimación: tu consentimiento. Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (MailRelay). Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control. Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.

¿Inteligente, no?

Si ejecutamos el código de arriba por pantalla obtendremos el siguiente resultado:

[2, 4]

Encontrar el índice de un elemento en un array de NumPy

Adicionalmente, y para no olvidarnos de NumPy, si tienes un array de elementos, puedes encontrar las posiciones de dichos elementos utilizando la función where.

No voy a entrar mucho en profundidad porque la función where es más potente y tiene usos más allá de este, por lo que se sale un poco del alcance de este artículo. Además no quiero que se haga mucho más largo.

La función where, usada y tal como se propone aquí, nos va a devolver los índices de los elementos que cumplan una determinada condición pasada como parámetro a la función. Lo que tenemos que hacer aquí es decir que la condición será comparar la lista con el elemento a buscar mediante el operador ==. Lo vemos en un ejemplo para que se entienda mejor:

import numpy as np

lista = np.array([10, 20, 30, 40, 30, 20, 10])  # el array de numpy

posiciones = np.where(lista == 20)  # buscamos las posiciones del elemento 20
print(f' Posiciones de 20: {posiciones}')

posiciones = np.where(lista == 40)  # buscamos la posición del elemento 40
print(f' Posición de 40: {posiciones[0]}')  # accedemos al primer elemento de posiciones

posiciones = np.where(lista == 50)  # buscamos la posición del elemento 50 (que no existe)
print(f' Posición de 50: {posiciones[0]}')

Tras ejecutar este código obtendremos lo siguiente por pantalla:

 Posiciones de 20: (array([1, 5]),)
 Posición de 40: [3]
 Posición de 50: []

Conclusiones

Bueno, creo que te he dado unas cuantas herramientas y métodos, así como profundizado en diversos problemas y cómo solucionarlos. ¡Con esto ya eres experta (o experto) buscando posiciones de elementos en listas de Python!

Si crees que has aprendido algo con este artículo considera suscribirte a la lista de correo de Código Pitón para recibir más trucos y consejos. ¡Además te llegará un valioso regalo! Y no dudes en compartir este artículo… ¡Gracias!

¡Feliz programación! 🙂

 🎁 Tutorial Básico Interactivo y La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
¿Quieres mejorar tu Python? Recibe totalmente gratis el Tutorial Básico Interactivo de Python, la Hoja de Referencia de Python y contenido exclusivo como trucos y consejos.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Laura Otero Moreira. Finalidad de la recogida y tratamiento de los datos personales: enviarte boletín informativo de Python y comunicaciones comerciales. Legitimación: tu consentimiento. Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (MailRelay). Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control. Más información en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.