- Expresiones de Lista
- Expresiones de Conjunto
- Expresiones de Diccionario
- Expresiones Generadoras
- ¿Cuándo Usar Cada Enfoque?
- Resumen
La mayoría de las operaciones sobre colecciones en Python combinan filtrado filter() y transformación map().
⏬ Ejemplo usando filter() y map() para obtener nombres de usuarios mayores de 10 años:
users = [
{'name': 'Carlos', 'age': 19},
{'name': 'Daniel', 'age': 1},
{'name': 'Valeria', 'age': 4},
{'name': 'Mateo', 'age': 16},
]
filtered_users = filter(lambda user: user['age'] > 10, users)
names = map(lambda user: user['name'], filtered_users)
list(names) # ['Carlos', 'Mateo']
Expresiones de Lista
Una alternativa más compacta y legible es usar expresiones de lista (list comprehensions):
names = [user['name'] for user in users if user['age'] > 10]
print(names) # ['Carlos', 'Mateo']
Estructura de una expresiones de lista:
[EXPR for VAR in SECUENCIA if CONDICIÓN]
EXPR– Expresión aplicada a cada elemento.VAR– Variable que representa cada elemento de la secuencia.SECUENCIA– Lista o iterador a recorrer.CONDICIÓN– (Opcional) Filtra elementos antes de aplicar la transformación.
⏬ Ejemplo con descomposición de tuplas:
pairs = [(1, 2), (4, 4), (5, 7), (0, 0)]
indices = [i for i, (x, y) in enumerate(pairs) if x == y]
print(indices) # [1, 3]
Ventajas de las expresiones de lista
✔ Más conciso y legible.
✔ Evita crear variables temporales innecesarias.
✔ Se puede anidar para procesar estructuras más complejas.
Expresiones de Conjunto
Expresiones de Conjunto (set comprehensions) funcionan similar a list comprehensions, pero creando conjuntos en vez de listas:
squares = {x * x for x in range(10)}
print(squares) # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
En este caso, se crea un conjunto con los cuadrados de los números del 0 al 9. A diferencia de las listas, los conjuntos no permiten elementos duplicados, lo que puede ser útil para filtrar valores repetidos automáticamente.
Expresiones de Diccionario
También podemos construir diccionarios de manera compacta con Expresiones de Diccionario (Dict Comprehensions):
char_positions = {char: pos for pos, char in enumerate("Hola Mundo")}
print(char_positions)
# {'H': 0, 'o': 1, 'l': 2, 'a': 3, ' ': 4, 'M': 5, 'u': 6, 'n': 7, 'd': 8}
En este ejemplo, creamos un diccionario donde cada carácter de la cadena "Hola Mundo" se asocia con su posición en la cadena.
Expresiones Generadoras
A diferencia de las list comprehensions, que crean una lista completa en memoria, las expresiones generadoras (generator expressions) evalúan los elementos de manera perezosa (lazy evaluation). Esto significa que los valores se calculan solo cuando se necesitan, lo que puede ahorrar memoria en estructuras grandes.
gen = (x * x for x in range(10))
print(gen) # <generator object <genexpr> at 0x...>
Para obtener los valores de un generador, podemos usar un bucle for o la función next():
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 4
Los generadores son especialmente útiles cuando trabajamos con grandes volúmenes de datos y queremos optimizar el uso de memoria.
Ventajas de los Generadores
✔ Menos uso de memoria, ideal para grandes volúmenes de datos.
✔ Se procesan elemento por elemento, sin almacenar toda la secuencia en memoria.
Diferencia clave: Mientras que list comprehensions generan una lista completa, los generadores son evaluados perezosamente (lazy evaluation).
Ejemplo con any() (detectar si algún número es mayor a 100)
result = any(x > 100 for x in range(1000000))
print(result) # True
Sin generadores: Se construiría un array de 1 millón de elementos, ocupando más memoria.
¿Cuándo Usar Cada Enfoque?
| Método | Uso recomendado |
|---|---|
map() y filter() |
Cuando la función ya existe y queremos aplicarla sin escribir una nueva. |
| Expresiones de Lista | Para combinar map() y filter() en una sola expresión más clara. |
| Expresiones de Conjunto | Cuando necesitamos colecciones únicas sin elementos repetidos. |
| Expresiones de Diccionario | Para transformar datos en un diccionario de manera eficiente. |
| Generador de Expresiones | Para iteraciones perezosas que evitan el uso innecesario de memoria. |
Resumen
List comprehensions hacen el código más limpio y legible.
Set y dict comprehensions permiten transformar datos de manera eficiente.
Generadores son ideales cuando no necesitamos almacenar la secuencia completa.
Usa la herramienta correcta según el caso para escribir código más eficiente.
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.