¿Cómo obtener elementos específicos de una lista? – ¡La forma más pitónica!

Resumen rápido del artículo para obtener un elemento específico de una lista:

  • Obtener elementos por índice
    • usar el operador [] con el índice del elemento
    • usar el método pop(índice) de la lista
    • usar la rebanada lst[start:stop:step] para obtener varios elementos a la vez
    • usar la función itemgetter() del módulo operator
  • Obtener elementos por condición
    • usar la función filter()
    • usar una declaración de comprensión de lista

Las listas de Python pertenecen sin duda a los conocimientos imprescindibles para cualquier desarrollador de Python. Permiten almacenar, iterar y manipular datos de manera efectiva y con muy poco código. Sin embargo, hay otro tema importante relacionado con las listas: ¿Cómo acceder a los elementos de una lista?

En la primera parte de este artículo, aprenderás todas las formas posibles de obtener elementos específicos de una lista. En la segunda parte verás cómo aplicar la teoría a cuestiones prácticas.

Tomemos como ejemplo una lista ps que contiene puntos del espacio 2D. Si necesitas más información sobre las listas, quiero recomendarte este artículo.

Obtener elementos específicos de una lista por índice

Para acceder a cualquier elemento de una lista, utiliza el operador de corchetes con el índice del elemento que desea recuperar. Por ejemplo, si queremos acceder al punto (4, 5) de nuestra lista ps escribimos:

# list of points from the 2D space
ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
point = ps[2]

Los índices comienzan en 0, por lo tanto, el índice del tercer elemento es 2. En Python también es posible contar de atrás hacia adelante usando índices negativos.

Esto es muy útil, especialmente para recuperar el último o penúltimo elemento.

El índice del último elemento de una lista es -1, el índice del penúltimo es – 2 y así sucesivamente.

Obtener elementos específicos de la lista usando pop()

Si deseas acceder y eliminar un elemento de una lista, llama al método pop() con el índice del elemento. Si no pasas un valor para el índice, el método pop()devuelve y elimina el último elemento de la lista.

Así es como obtienes y eliminas el elemento (4, 5) usando el método pop():

# list of points from the 2D space
ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]

item = ps.pop(2)
print(ps)
# [(2, 4), (-1, 7), (3, -4), (-1, -5)]

Ahora, la variable item tiene el valor (4, 5).

Obtener elementos específicos de la lista con rebanadas

Para obtener un rango continuo de elementos de una lista, utiliza las rebanadas.

Las rebanadas también utilizan el operador corchete con un índice de inicio y de fin. Como código tiene el siguiente aspecto:

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
items = ps[2:4]

donde el primer número antes de los dos puntos (:) es el índice de inicio y el segundo número, después de los dos puntos, es el índice final. El índice inicial está incluido, el índice final está excluido.

En nuestro ejemplo items = ps[2:4] el índice inicial es 2 y el índice final es 4. Dado que se incluye el índice de inicio, obtenemos los elementos de los índices 2 y 3.

No se incluye el índice final, por lo que no se incluye el elemento del índice 4. Así, el valor de la variable items será [(4, 5), (3, -4)].

Con las rebanadas puedes utilizar un tercer parámetro step para obtener elementos en un rango con separaciones regulares. Lee más sobre rebanadas en nuestro artículo detallado.

itemgetter()

El módulo operator proporciona la función itemgetter, que te permite acceder a varios elementos de una lista simultáneamente.

Aquí está el código:

from operator import itemgetter

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
got = itemgetter(0, 2, 3)(ps)

Tras esta línea, la variable got contiene los elementos de los índices 0, 2, 3 como tupla.

Obtener elementos de una lista usando filter()

En las soluciones que hemos comentado anteriormente, hemos utilizado índices para obtener elementos de una lista. Otra posibilidad es obtener los elementos de una lista según una determinada condición; por ejemplo, podríamos querer obtener todos los elementos de la lista ps que están a una distancia de 6,0 o más de (0, 0). Dado que no conocemos los índices de esos elementos, no podemos usar una solución que requiera los índices. Python proporciona una funcion incorporada denominada filter().

El método filter() requiere dos parámetros: una función que devuelva Verdadero/Falso y un iterable. El método filter() aplica la función a cada elemento del iterable y mantiene sólo los elementos para los que la función devuelva Verdadero.

Usando la función filter() podemos obtener todos los elementos con una distancia mayor que 6.0 desde (0, 0) así:

def dist(x):
    return (x[0] ** 2 + x[1] ** 2) ** 0.5

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
filtered = list(filter(lambda x: dist(x) > 6.0, ps))

Como puedes ver en el código, el resultado de la función filter() debe volver a convertirse en una lista.

Comprensión de listas con condición

¿Necesitas información sobre la comprensión de las listas? Aquí encontrarás más información.

Otra forma de obtener todos los elementos de una lista que satisfacen una determinada condición es mediante una comprensión de lista. El algoritmo que hay detrás de la comprensión de lista se denomina Búsqueda Lineal.

La Búsqueda Lineal itera sobre la entrada una vez y anexa todos los elementos que satisfacen la condición a una nueva lista.

En nuestro ejemplo donde queremos obtener todos los puntos de la lista ps cuya distancia a (0, 0) es mayor que 6,0 necesitamos el siguiente código:

def dist(x):
    return (x[0] ** 2 + x[1] ** 2) ** 0.5

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
filtered = [p for p in ps if dist(p) > 6.0]

Aplicacio­nes

En esta sección queremos ampliar un poco el alcance y ver cómo podemos aplicar las

soluciones presentadas anteriormente. Por tanto, elegimos algunos problemas típicos.

Obtener índices específicos de una lista

Para obtener todos los índices de un subconjunto de elementos que satisfacen una determinada condición,

utiliza una comprensión de lista:

def dist(x):
    return (x[0] ** 2 + x[1] ** 2) ** 0.5

ps = [(2, 4), (-1, 7), (4, 5), (3, -4), (-1, -5)]
filtered = [idx for idx, p in enumerate(ps) if dist(p) > 6.0]

Obtener líneas específicas de un archivo

Supón que quieres obtener todos los comentarios de un archivo de código.

De nuevo, te sugiero que utilices una comprensión de lista y para analizar cada línea, una expresión regular.

import re

pattern = r'^#.*$'
comments = [line for line in open('code.py') if re.match(pattern, line)]

Si quieres saber más sobre como leer líneas de un archivo, este artículo te puede interesar.

Obtener una parte específica de una cadena

Para obtener una parte específica de una cadena o subcadena, utiliza rebanadas.

Por ejemplo, para obtener la subcadena del 3 al 9 de la cadena "Python is cool!".

s = 'Python is cool!'
substring = s[3:10]

Obtener claves específicas de un diccionario

Aunque este tema puede pertenecer más al ámbito de los diccionarios, me gustaría mencionar que al convertir un diccionario en una lista, se obtiene una lista de las claves del diccionario.

Y ahora, volvemos al tema de obtener elementos concretos de una lista.

Para problemas más avanzados, utiliza el método de dicionario items(). Por ejemplo, para recuperar todas las claves cuyo valor sea una vocal:

d = {0:'a', 1:'b', 2:'c', 3:'d', 4:'e'}
vowels = [key for key, item in d.items() if item in 'aeiou']

¡Aprende todo sobre los diccionarios de Python aquí!

Conclusión

Si quieres obtener elementos concretos de una lista en Python tienes varias maneras de hacerlo.

Puedes clasificar estas soluciones en dos grupos:

  • Obtener elementos por índice
    • usar el operador [] con el índice del elemento
    • usar el método de lista pop(índice)
    • usar la rebanada lst[start:stop:step] para obtener varios elementos a la vez
    • usar la función itemgetter() del módulo operator
  • Obtener elementos por condición
    • usar la función filter()
    • usar una comprensión de lista

En cualquier caso, es importante para cualquier programador experto en Python dominar estas diferentes soluciones.