Python – Listas por comprensión – 2

Objetivo: presentar la sintaxis extendida de la generación de listas por comprensión en Python.

En el artículo anterior mostramos la elegancia de Python en la forma de las listas por comprensión, mecanismo que nos permitía, con una única instrucción, generar una lista a través de la transformación de los elementos de un iterable.

Vamos a dar un pase adelante y refinemos la creación de esa lista mediante la introducción de un filtro selectivo.

Dado el siguiente listado de alumnos de una clase:

>>> alumnos = ['Ana', 'Luis', 'Pedro', 'Marta', 'Nerea', 'Pablo']

Supongamos que queremos obtener las iniciales de todas las chicas del grupo.

Obtener simplemente las iniciales no debería plantearte mucho problema con las técnicas que ya conoces:

>>> [alumno[0] for alumno in alumnos]
['A', 'L', 'P', 'M', 'N', 'P']

Recorremos la lista alumnos de alumno en alumno y nos quedamos con la primera letra de cada uno (alumno[0]).

Pero, ¿podemos realizar el filtrado de sexo manteniendo la elegancia de las listas por comprensión?

Es preciso recurrir a la sintaxis extendida:

– Comenzamos recorriendo el iterable.

– Escribimos a la izquierda la transformación deseada.

– Escribimos a la derecha la condición de filtrado.

– Encerramos todo el conjunto entre corchetes.

He aquí la solución buscada:

>>> [alumno[0] for alumno in alumnos if alumno[-1] == 'a']
['A', 'M', 'N']

Observa que alumno[-1] representa a la última letra de cada nombre. Naturalmente, nos hemos permitido simplificar el problema presuponiendo que los nombres de mujer son aquellos que terminan en a.

Recuerda que las listas por comprensión no modifican la lista original sino que crean otra nueva.

El primer término no tiene que implicar necesariamente una transformación. Por ejemplo, si en vez de la inicial queremos el nombre completo, podríamos haber procedido así, obviamente:

>>> [alumno for alumno in alumnos if alumno[-1] == 'a']
['Ana', 'Marta', 'Nerea']

Vamos a complicarlo algo más. El siguiente diccionario contiene las calificaciones de esos alumnos:

>>> notas = {'Ana':9, 'Luis':7, 'Pedro':2, 'Marta':5, 'Nerea':4, 'Pablo':6}

Debemos obtener los nombres de todos aquellos que hayan aprobado:

Desglosemos la lista por comprensión en sus tres términos. Comenzamos por el central, correspondiente a la iteración:

for nombre, nota in notas.items()

Fíjate en el uso del método items() para poder iterar simultáneamente sobre las claves y los valores del diccionario.

En el primer término indicamos lo que queremos extraer:

nombre

Y en el tercero realizamos el filtrado:

if nota >= 5

Todo junto, entre corchetes, nos devuelve la lista buscada:

>>> [nombre for nombre, nota in notas.items() if nota >= 5]
['Ana', 'Luis', 'Pablo', 'Marta']

No te costará mucho habituarte a las listas por comprensión. Código limpio y eficiente, ¡Python es esto, quién podría resistirse?

Javier Montero Gabarró


Python – Listas por comprensión – 2


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

4 opiniones en “Python – Listas por comprensión – 2”

  1. Muchas felicidades por tu trabajo Javier. Hasta un tipo como yo puede aprender contigo. Gracias.
    Tengo una pregunta respecto al ejemplo que da como salida a las personas que han aprobado. ¿Cómo sería la sintaxis para que además de la clave (el nombre) diese el valor (la nota)?

    PD: Solo se me ocurre:
    for aprobados in notas:
    print(aprobados, notas[aprobados])
    Pero no me cuadra con el concepto de elegancia 😀

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies