Sintaxis de list, dict y set comprehensions en Python

Clase 3 de 25Curso de Python Intermedio para Entornos virtuales y PEP8

Resumen

Domina cómo escribir código más pythónico transformando bucles anidados en una sola línea con list comprehension, dict comprehension y set comprehension. Verás cómo refactorizar desde un for tradicional, aplicar filtros con if, usar len para validaciones y construir objetos más claros y legibles.

¿Qué son las comprehensions en Python y para qué sirven?

Las comprehensions permiten crear listas, diccionarios y conjuntos de forma compacta y legible. En lugar de acumular valores con variables temporales y múltiples líneas, condensas la iteración, el mapeo y el filtro en una expresión clara.

  • Generan el mismo resultado que un for tradicional, con menos código.
  • Mejoran la lectura: menos ruido y menos variables temporales.
  • Soportan condiciones directamente en la expresión.

¿Qué piezas componen la sintaxis de una list comprehension?

  • Expresión de salida: qué valor quieres en la lista.
  • Iteración: el for que recorre los elementos.
  • Filtro opcional: un if para incluir o excluir.

¿Cómo refactorizar un for tradicional a una list comprehension?

Primero, extraer títulos con un for acumulando en una lista.

def extract_titles_traditional(articles): """Extrae solo los títulos usando un for.""" titles = [] for article in articles: titles.append(article["title"]) # iteración + acumulación return titles

Ahora, la misma lógica con list comprehension y retorno en una línea.

def extract_titles(articles): """Extrae solo los títulos usando un comprehension.""" return [article["title"] for article in articles]
  • Resultado idéntico en consola al imprimir ambos llamados.
  • Más limpio y directo: la firma de la función no cambia, solo la implementación.

¿Qué ventajas aporta la sintaxis compacta y el retorno en una línea?

  • Menos probabilidad de errores por variables intermedias.
  • Intención clara: mapeo de artículos a títulos.
  • Compatible con herramientas de formato automático, por ejemplo, Ruff ordena la expresión para mayor legibilidad.

¿Cómo aplicar filtros con if y construir objetos con dict comprehension?

Puedes incluir validaciones en la misma línea. Por ejemplo, extraer solo títulos con al menos 10 caracteres usando len y un if al final.

def extract_titles_long(articles): return [a["title"] for a in articles if len(a["title"]) > 10]

Para crear un diccionario a partir de los artículos, usa dict comprehension: cada entrada tendrá llave y valor. Por ejemplo, título como llave y descripción como valor, filtrando por descripciones de longitud mínima.

# Filtra descripciones largas y construye un dict título -> descripción long_desc_by_title = { a["title"]: a["description"] for a in articles if len(a["description"]) > 20 # puede devolver vacío si ninguna cumple } # Ajusta el umbral si necesitas resultados visibles by_title_min5 = {a["title"]: a["description"] for a in articles if len(a["description"]) > 5}
  • El if en list y dict comprehensions va al final de la expresión.
  • Si el filtro es muy estricto, el resultado puede ser vacío; reduce el umbral y vuelve a ejecutar.

¿Cómo crear un conjunto de fuentes únicas con set comprehension?

Reto propuesto: construir un conjunto de fuentes sin duplicados. Empieza con el enfoque tradicional y luego refactoriza.

# Forma tradicional def unique_sources_traditional(articles): sources = set() for a in articles: sources.add(a["source"]) # evita duplicados de manera natural return sources # Con set comprehension def unique_sources(articles): return {a["source"] for a in articles}
  • Un set elimina duplicados automáticamente.
  • La set comprehension condensa iteración y recolección en una sola línea.

¿Tienes tu solución al reto u otra variación con filtros en dict o list comprehensions? Compártela en los comentarios para impulsar la discusión y ayudar a otros estudiantes.