Curso de Python / Crear listas, diccionarios y conjuntos por comprensión

Una comprensión crea una colección transformando elementos o seleccionando los que cumplen una condición. Úsala para una transformación breve y legible; cuando hay varios pasos, manejo de excepciones o acciones como guardar archivos, un bucle normal suele expresar mejor el proceso.

Separar transformación y filtrado

La forma de una comprensión de lista es [expresion for elemento in origen if condicion]. El if final decide si un elemento se incluye. Una expresión como a if condicion else b elige, en cambio, el valor que tendrá un elemento incluido.

El recorrido toma un elemento, comprueba el filtro y evalúa la expresión para los elementos aceptados. Por ejemplo, [x * 2 for x in range(4) if x % 2 == 0] acepta cero y dos y produce [0, 4]. Puedes expandir esa operación a un for con append() para seguir su funcionamiento.

Crear una lista nueva no clona automáticamente los objetos internos. La expresión utilizada determina si los elementos de una colección anidada continúan compartidos. Consulta la referencia oficial de comprensiones y las reglas del recorrido con for.

Construir tres tipos de colección

Guarda el siguiente programa como comprehensions.py en UTF-8. Ejecútalo con python comprehensions.py desde la carpeta de práctica y con el entorno del proyecto seleccionado. Fuera del entorno en macOS o Ubuntu, utiliza python3 cuando corresponda a tu intérprete.

amounts = [3500, -1, 8000, 0]
valid = [x for x in amounts if x >= 0]
labels = ["paid" if x > 0 else "free" for x in valid]
records = [("food", 3500), ("bus", 2500)]
by_name = {name: amount for name, amount in records}
remainders = {x % 3 for x in valid}
print(valid)
print(labels)
print(by_name)
print(sorted(remainders))

La salida esperada muestra los importes válidos, sus etiquetas, el diccionario por nombre y los restos sin duplicados:

[3500, 8000, 0]
['paid', 'paid', 'free']
{'food': 3500, 'bus': 2500}
[0, 2]

El primer filtro conserva el cero y excluye el negativo. La segunda lista clasifica cada importe válido como paid o free sin quitar elementos. El diccionario relaciona nombres con importes y el conjunto reduce los restos repetidos a elementos únicos.

Tener en cuenta claves y valores repetidos

En una comprensión de diccionario, una aparición posterior de la misma clave sustituye su valor anterior. Por tanto, escribir {category: amount for ...} no calcula totales por categoría. Para combinar importes de claves repetidas necesitas una acumulación, como en el ejemplo de totales con diccionarios.

Una comprensión de conjunto elimina duplicados. Su tamaño puede ser menor que la cantidad de registros de origen, lo que es correcto si buscas unicidad y equivocado si necesitas conservar cuántas veces apareció cada dato.

Expresa primero la regla correctamente con un bucle normal. Después decide si una sola transformación o un filtro mejora su legibilidad. Una comprensión profundamente anidada puede dificultar el mantenimiento aunque ocupe menos líneas.

Comprobar resultados vacíos y evitar efectos secundarios

Si el filtro excluye todos los elementos, el resultado es una colección vacía. Define qué significa ese caso antes de consultar su primera posición o dividir entre su longitud. No uses una comprensión solo para imprimir o guardar archivos: un for hace explícitas esas acciones sin crear una lista de resultados que nadie utiliza.

  1. Cambia el filtro >= 0 por > 0 y comprueba que desaparece el cero.
  2. Añade un registro con el mismo nombre y observa la sustitución en el diccionario.
  3. Restaura los datos y explica por qué sumar por categoría requiere acumular, no solamente construir claves.

Conserva el bucle normal cuando necesites gestionar errores por elemento o realizar varias acciones relacionadas. La claridad del orden de operaciones importa más que concentrarlas en una sola línea.