Está en la página 1de 14

Programación con Python

Lista por comprensión


Prof. Wilmer Fariñas
Listas por comprensión
La comprensión de listas en Python es un método
sintáctico para crear listas (y por extensión también
otras colecciones) a partir de los elementos de otras
listas (o colecciones) de una forma rápida de escribir,
muy legible y funcionalmente eficiente. Nos permite
crear listas avanzadas en una misma línea de código
Listas por comprensión
Para entender qué son las listas por comprensión
tomémonos primero un momento para responder a las
siguientes dos preguntas:

¿Qué es un conjunto?

¿Cómo se define un conjunto?

En matemáticas, un conjunto es simplemente una colección


de elementos bien definidos. Los elementos pueden ser
cualquier cosa: números, letras, nombres, figuras, etc.
Listas por comprensión
Hay dos manera de definir los elementos que pertenecen a un
conjunto: por extensión o por comprensión. Cuando se define
un conjunto por extensión cada elemento se enumera de
manera explícita. Tomando un ejemplo inspirado en el Señor de
los Anillos de J. R. R. Tolkien:
A = { Frodo, Sam, Pippin, Merry, Legolas,
Gimli, Aragorn, Boromir, Gandalf }
La expresión anterior se lee así: A es el conjunto formado por los
elementos: Frodo, Sam, Pippin, Merry, Legolas, Gimli, Aragorn,
Boromir y Gandalf.
Listas por comprensión
Por otro lado, cuando un conjunto se define por
comprensión no se mencionan los elementos uno por
uno sino que se indica una propiedad que todos éstos
cumplen, por ejemplo:

B = { x | x ∈ Comunidad del Anillo }

La expresión de arriba se lee así: B es el conjunto de


elementos x tales que x pertenece a la Comunidad del
Anillo.
Listas por comprensión
Así como matemáticamente se pueden definir los conjuntos por
extensión y por comprensión, en Python se pueden definir las
listas también por extensión y por comprensión.
Supongamos, como ejemplo, que deseamos tener una lista con
las primeras diez potencias de dos. Una potencia de dos es
cualquiera de los números obtenidos al elevar el número dos a
una potencia entera no negativa. El siguiente código de Python
cumple con este cometido usando una lista por extensión
(enumerando todos los elementos de manera explícita):
c = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
Listas por comprensión
Matemáticamente, un conjunto equivalente a la lista
anterior se puede definir por comprensión así:

C = { 2x | x ∈ ℤ ∧ 0 ≤ x < 10 }

Dicha expresión se puede traducir a Python


directamente usando la notación de listas por
comprensión:

c = [2 ** x for x in range(10)]
Listas por comprensión
La sintaxis de listas por comprensión consiste en colocar entre corchetes
una expresión (2 ** x) seguida de una cláusula for. Dicha cláusula es muy
similar en intención a un ciclo for convencional. En este caso estamos
indicando que la variable x tomará los valores devueltos por la función
range(10) (los enteros del 0 al 9). A partir de cada valor que toma x se
calcula el resultado de la expresión 2 ** x y con eso se determinan los
valores finales de la lista resultante.
Listas por comprensión
La sintaxis de listas por comprensión consiste en colocar
entre corchetes una expresión (2 ** x) seguida de una
cláusula for. Dicha cláusula es muy similar en intención a un
ciclo for convencional. En este caso estamos indicando que
la variable x tomará los valores devueltos por la función
range(10) (los enteros del 0 al 9). A partir de cada valor que
toma x se calcula el resultado de la expresión 2 ** x y con
eso se determinan los valores finales de la lista resultante.
Listas por comprensión
Ejemplo:

Lista con todos los números entre 1 y 100 que sean


múltiplos de 7 o que terminen con el dígito 7

[n for n in range(1, 101) if n % 7 == 0 or n % 10 == 7]


Listas por comprensión
Puede haber más de una cláusula for en una lista por comprensión (también
puede haber cero o más cláusulas if). Como ejemplo, supongamos que tengo
cuatro camisas (de color rojo, amarillo, azul y verde) y dos pantalones (de
color negro y blanco). Quiero saber de qué manera puedo combinar mi ropa.
Hay ocho formas distintas (4 camisas × 2 pantalones) de hacerlo:

Camisa roja y pantalón negro. Camisa azul y pantalón negro.


Camisa roja y pantalón blanco. Camisa azul y pantalón blanco.
Camisa amarilla y pantalón negro. Camisa verde y pantalón negro.
Camisa amarilla y pantalón blanco. Camisa verde y pantalón blanco.
Listas por comprensión
Podemos dejar que Python calcule lo anterior usando
una lista por comprensión con dos cláusulas for:

[(camisa, pantalon)
for camisa in ['rojo', 'amarillo', 'azul', 'verde']
for pantalon in ['negro', 'blanco']]
Listas por comprensión
Creando una matriz identidad
Una matriz identidad de tamaño n es una matriz cuadrada
de n renglones por n columnas en donde cada elemento
de la diagonal principal es 1 y los elementos restantes son
0. Por ejemplo, la siguiente es una matriz identidad de
tamaño n = 4:
Listas por comprensión
La siguiente función de Python crea un matriz
identidad de tamaño n usando listas por comprensión:

def matriz_identidad(n):
"""Devuelve una lista de listas que representa una
matriz identidad de tamaño n."""
return [[(1 if ren == col else 0) for col in range(n)]
for ren in range(n)]

También podría gustarte