Las comprensiones en Python (comprehensions en inglés) son un tipo de construcción específica de este lenguaje, que permite crear secuencias a partir de otras secuencias o de iterables.
Vamos con un ejemplo: imaginate que querés crear una lista a partir de otra. Una manera de hacerlo sería la siguiente:
lista_inicial = [1, 2, 3]
lista_nueva = []
for elemento in lista_inicial:
lista_nueva.append(elemento + 1)
print(lista_nueva) # Salida: [2,3,4]
Bueno, una manera de obtener el mismo resultado en Python utilizando una lista por comprensión sería la siguiente:
lista_nueva = [elemento + 1 for elemento in lista_inicial]
Más sencillo ¿No?
Filtrado dentro de la comprensión

Además de escribir menos código, otra ventaja es tener una manera fácil de filtrar una lista:
lista1 = [1, 2, 3, 4, 5, 6, 7, 8]
lista2 = [item * 2 for item in lista1 if item > 5]
# Filtra los números mayores a 5 y los multiplica por 2
print(lista2) # Salida: [12, 14, 16]
¿Y si tenemos más de una condición? Normalmente utilizaríamos la palabra reservada elif, pero eso no es válido dentro de una comprensión. Sin embargo, se puede simular el comportamiento utilizando expresiones condicionales (if-else) dentro de la comprensión:
lista1 = [1, 2, 3, 4, 5, 6, 7, 8]
# Si el elemento es mayor a 5, lo multiplica por 2; si no, lo multiplica por 3
lista2 = [i * 2 if i > 5 else i * 3 for i in lista1]
print(lista2) # Salida: [3, 6, 9, 12, 15, 12, 14, 16]
Listas por comprensión anidadas
Qué pasa si queremos llevar a este tipo de sintaxis una situación donde tenemos más de un ciclo uno dentro de otro (anidados):
lista1 = [1, 2, 3, 4, 5, 6, 7, 8]
# Usando un bucle estándar
lista2 = []
for item in lista1:
if item > 5:
for factor in [2, 3]:
lista2.append(item * factor)
print(lista2) # Salida: [12, 18, 14, 21, 16, 24]
# Usando una lista por comprensión anidada
lista2 = [item * factor for item in lista1 if item > 5 for factor in [2, 3]]
print(lista2) # Salida: [12, 18, 14, 21, 16, 24]
Mi recomendación es no abusar de estas expresiones, siguiendo Zen de Python Simple es mejor que complejo y no tiene sentido hacer una comprensión difícil de leer, sino mejor ir por un bucle normal que sea más fácil de entender a simple vista.
Otras comprensiones
Existen otras comprensiones que no se basan en listas pero que permiten tener un comportamiento similar para otras estructuras de datos
Diccionarios por comprensión
Los diccionarios por comprensión se caracterizan por el uso de llaves { } y del par clave:valor separado por dos puntos. En el siguiente ejemplo crearemos un diccionario en base a una lista de palabras donde la clave sea cada palabra tal cual aparece y el valor sea esa misma palabra en mayúsculas:
palabras = ["python", "carpincho", "diccionario"]
diccionario_nuevo = {palabra: palabra.upper() for palabra in palabras}
print(diccionario_nuevo) # Salida: {'python': 'PYTHON', 'carpincho': 'CARPINCHO', 'diccionario': 'DICCIONARIO'}
Lo cual equivale a hacer lo siguiente:
palabras = ["python", "carpincho", "diccionario"]
diccionario_nuevo = {}
for palabra in palabras:
diccionario_nuevo[palabra] = palabra.upper()
print(diccionario_nuevo) # Salida: {'python': 'PYTHON', 'carpincho': 'CARPINCHO', 'diccionario': 'DICCIONARIO'}
Conjuntos (sets) por comprensión
Los conjuntos (o sets) son colecciones no ordenada de elementos únicos en Python que simulan a los conjuntos matemáticos. Suelen ser menos conocidos aunque son muy útiles ya que no admiten duplicados y permiten operaciones de conjuntos como la unión y la intersección.
Tienen su equivalente por comprensión y aunque la sintaxis es similar no hay que confundirla con la de los diccionarios ya que ambos utilizan llaves, pero los diccionarios tienen los dos puntos ( : ) separando la clave del valor como vimos en la sección anterior.
# Lista con números repetidos
numeros = [1, 2, 3, 4, 5, 3, 2, 1, 4, 5]
# Crear un conjunto vacío
mi_set = set()
# Usar un bucle para calcular los cuadrados de los números mayores a 2
for x in numeros:
if x > 2:
mi_set.add(x**2) # Agregar el cuadrado al conjunto
print(mi_set) # Salida: {9, 16, 25}
Ahora vamos a hacer lo mismo usando un conjunto por comprensión:
# Lista con números repetidos
numeros = [1, 2, 3, 4, 5, 3, 2, 1, 4, 5]
mi_set_por_comprension = {x**2 for x in numeros if x > 2}
print(mi_set_por_comprension) # Salida: {9, 16, 25}
Generadores por comprensión
Los generadores por comprensión en Python utilizan paréntesis () y son una forma compacta de crear un generador. Los generadores son un tipo especial de iterable que produce elementos uno a uno, en lugar de materializar toda la colección en memoria de inmediato. Veamos un ejemplo:
# Generador para los cuadrados de los números del 1 al 5
generador = (x**2 for x in range(1, 6))
# Los datos se producen de uno en uno y no se almacenan en memoria como ocurre con las listas.
for valor in generador:
print(valor)
# Salida: 1
# Salida: 4
# Salida: 9
# Salida: 16
# Salida: 25
📝 Conclusiones
Para finalizar te dejo una tabla repasando la sintaxis de cada tipo de comprensión:
Las comprensiones pueden ser útiles para escribir código más “pythónico”, es decir, claro, conciso y mantenible aprovechando las funcionalidad del lenguaje y hasta podría, en ciertos casos, ser computacionalmente más eficiente. Ya sea que decidas usarlas en tu código o tengas que leer el código de otra persona es muy probable que te cruces con ellas, por lo cual espero que te sirva esta información.
¿Te interesa seguir aprendiendo más sobre Python?
Si este contenido te resultó útil y te interesa leer contenido sobre programación principalmente en Python, ciencia de datos e inteligencia artificial? Seguime en mis redes:
🐙 GitHub: https://github.com/GEJ1
📘 LinkedIn: Gustavo Juantorena
📹 YouTube: Gustavo Juantorena - Programación y Ciencia de Datos
Si te gustó el post, ¡Compartilo para que más personas puedan aprender!