Comprensión de listas — Crear una lista en una sola línea
Al finalizar este tema
Conocerás la sintaxis de las comprensiones de listas, que permiten convertir cuatro líneas de un bucle for en una sola línea, y podrás utilizar filtrado con condiciones y comprensiones de diccionarios.
Patrón de repetición del bucle for
Al crear una lista, es común escribir código como este:
numbers = [1, 2, 3, 4, 5]squares = []for n in numbers: squares.append(n ** 2)
print(squares) # [1, 4, 9, 16, 25]Son cuatro líneas. Crear una lista vacía, recorrerla con un bucle for, usar append y repetir este patrón continuamente. Python ofrece una sintaxis para reducir esto a una sola línea:
squares = [n ** 2 for n in numbers]Esta es una comprensión de listas (list comprehension).
Estructura
[expresión for variable in iterable]Cómo leerlo: «Extrae una variable a la vez de lo que es repetible y crea una lista con el resultado de aplicar la expresión.»
# Convertir cadenas a mayúsculasnames = ['alice', 'bob', 'charlie']upper = [name.upper() for name in names]# ['ALICE', 'BOB', 'CHARLIE']
# Longitud de las cadenaslengths = [len(name) for name in names]# [5, 3, 7]
# De 1 a 10nums = [i for i in range(1, 11)]# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]Filtrado de condiciones: adición de if
[expresión for variable in iterable if condición]numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Solo números paresevens = [n for n in numbers if n % 2 == 0]# [2, 4, 6, 8, 10]
# Cuadrados de los números mayores que 3big_squares = [n ** 2 for n in numbers if n > 3]# [16, 25, 36, 49, 64, 81, 100]if actúa como un filtro. Solo se incluyen en los resultados aquellos que cumplen con la condición especificada.
Si se escribe usando un bucle for:
evens = []for n in numbers: if n % 2 == 0: evens.append(n)Cinco líneas se convierten en una sola.
if-else — Transformación condicional
Si desea realizar una transformación en lugar de un filtro, coloque if-else al principio:
# "par" si es par, "impar" si es imparlabels = ["par" if n % 2 == 0 else "impar" for n in range(1, 6)]# ['impar', 'par', 'impar', 'par', 'impar']La ubicación es diferente:
- Filtro (exclusión):
[x for x in lst if condición]—ifva al final - Transformación (selección):
[A if condición else B for x in lst]—if-elseva al principio
Comprensión de diccionarios
Encerrar entre llaves crea un diccionario:
names = ['alice', 'bob', 'charlie']name_len = {name: len(name) for name in names}# {'alice': 5, 'bob': 3, 'charlie': 7}# Invertir claves y valoresoriginal = {'a': 1, 'b': 2, 'c': 3}flipped = {v: k for k, v in original.items()}# {1: 'a', 2: 'b', 3: 'c'}Comprensión de conjuntos
Si solo se colocan valores entre llaves, es un conjunto:
words = ['hello', 'world', 'hello', 'python']unique_lengths = {len(w) for w in words}# {5, 6}Advertencia de legibilidad
# Esto está bienresult = [x * 2 for x in range(10) if x % 2 == 0]
# Esto es difícil de leerresult = [f(x, y) for x in range(10) for y in range(10) if x != y if g(x, y) > threshold]Si la comprensión no cabe en una sola línea, o si hay bucles for anidados + 2 o más condiciones, es mejor usar un bucle for convencional. El código corto no siempre es buen código. El buen código es el que se puede leer.
Clave
La comprensión de listas es una sintaxis para crear listas en una sola línea:
[expresión for variable in iterable if condición]. Para el filtrado, se colocaifal final; para la transformación condicional, se colocaif-elseal principio.{}+key: valueresulta en un diccionario;{}+ solo el valor resulta en una comprensión de conjuntos. Si no puede incluirlo todo en una sola línea, use un bucle for — la legibilidad es lo primero.