- 1 1. Introducción
- 2 2. Fundamentos de las comprensiones de listas en Python
- 3 3. if con comprensión de listas condicional
- 4 4. Notación de comprensión de listas usando if-else
- 5 5. Listas de comprensión anidadas y bifurcaciones condicionales
- 6 6. Mejores prácticas y puntos de atención para la notación de comprensión de listas
- 7 7. Preguntas frecuentes (FAQ)
- 7.1 Q1. ¿Es posible el filtrado condicional usando if dos veces?
- 7.2 Q2. ¿Cuál usar, la notación de comprensión de listas o el for normal?
- 7.3 Q3. ¿Cuál es la diferencia entre usar if-else y usar solo if?
- 7.4 Q4. ¿La notación de comprensión de listas es más rápida que el for normal?
- 7.5 Q5. ¿También hay notación de comprensión para set o dict?
- 7.6 Resumen
1. Introducción
La «comprensión de listas (List Comprehension)» de Python es una sintaxis conveniente para crear listas de manera concisa. En comparación con el caso en que se genera una lista utilizando unfor
bucle normal, ofrece ventajas tanto en la legibilidad del código como en la velocidad de ejecución.
En particular, al combinar la comprensión de listas con unaif
sentencia, se pueden extraer solo los elementos que cumplen con una condición, lo que permite operaciones de lista más flexibles. En este artículo, explicaremos en detalle, desde lo básico hasta lo avanzado, cómo combinar la comprensión de listas de Python conif
.
¿Qué es la comprensión de listas?
La comprensión de listas es una sintaxis de Python para crear listas de manera concisa. Permite escribir programas de alta legibilidad con código más corto que el de unfor
bucle normal.
Por ejemplo, para crear una lista de enteros del 0 al 4, utilizando unfor
bucle normal, sería como sigue.
numbers = []
for i in range(5):
numbers.append(i)
print(numbers) # [0, 1, 2, 3, 4]
Sin embargo, con la comprensión de listas, se puede escribir en una sola línea.
numbers = [i for i in range(5)]
print(numbers) # [0, 1, 2, 3, 4]
Ventajas de usar la comprensión de listas
Al utilizar la comprensión de listas, se obtienen las siguientes ventajas.
- El código se acorta y mejora la legibilidad
- En comparación con un
for
bucle normal, se puede reducir el número de líneas de código, lo que permite escribir código más limpio.
- Mejora la velocidad de procesamiento
- Dado que la comprensión de listas aprovecha mejor la optimización interna de Python que un
for
bucle, a menudo el procesamiento es más rápido.
- Se puede filtrar la lista fácilmente
- Al combinar con una
if
sentencia, se pueden extraer solo los elementos que coinciden con condiciones específicas.
¿Por qué usarif
en la comprensión de listas?
Al combinar la comprensión de listas conif
, se puede filtrar dinámicamente los elementos de la lista. Por ejemplo, para almacenar solo los números pares del 0 al 9 en una lista, utilizando unfor
bucle, sería como sigue.
evens = []
for i in range(10):
if i % 2 == 0:
evens.append(i)
print(evens) # [0, 2, 4, 6, 8]
Sin embargo, con la comprensión de listas, se puede implementar este procesamiento en una sola línea.
evens = [i for i in range(10) if i % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
De esta manera, al combinar la comprensión de listas conif
, se puede escribir fácilmente el procesamiento para agregar a la lista solo los elementos que cumplen con la condición.
Lo que se puede aprender en este artículo
En este artículo, explicaremos en detalle la combinación de la comprensión de listas de Python con laif
sentencia, cubriendo los siguientes contenidos.
- La sintaxis básica de la comprensión de listas
- La comprensión de listas condicional con
if
- La comprensión de listas con
if-else
- Métodos de uso de la comprensión de listas anidadas
- Puntos de atención y mejores prácticas al usar la comprensión de listas
- Preguntas frecuentes (FAQ)
Al utilizar la comprensión de listas, se puede escribir código de Python de manera más simple y eficiente. A continuación, lo explicaremos en detalle, así que por favor léalo hasta el final y profundice su comprensión escribiendo código usted mismo.
2. Fundamentos de las comprensiones de listas en Python
En la sección anterior, introdujimos qué son las comprensiones de listas y sus ventajas. A partir de aquí, explicaremos en detalle la sintaxis básica de las comprensiones de listas y profundizaremos en la comprensión a través de ejemplos concretos.
Sintaxis básica de las comprensiones de listas
La sintaxis básica de las comprensiones de listas es la siguiente.
[expresión for variable in iterable]
Elementos de la sintaxis
expresión
: El procesamiento aplicado a la variable (cálculos o funciones, etc.)for variable in iterable
: Bucle que extrae cada elemento de un iterable (lista, tupla, range, etc.)
Por ejemplo, al crear una lista que contenga enteros del 0 al 4, usando un buclefor
normal sería así.
numbers = []
for i in range(5):
numbers.append(i)
print(numbers) # [0, 1, 2, 3, 4]
Sin embargo, usando comprensiones de listas, se puede escribir en una sola línea.
numbers = [i for i in range(5)]
print(numbers) # [0, 1, 2, 3, 4]
Ejemplos básicos de comprensiones de listas
Usando comprensiones de listas, la creación y transformación de listas se vuelve sencilla. Aquí introducimos algunos ejemplos básicos.
1. Elevar cada elemento al cuadrado
Ejemplo de usar comprensiones de listas para almacenar en una lista los cuadrados de números del 0 al 9.
squares = [i**2 for i in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
En comparación con escribirlo con un buclefor
normal, se ve que el código se acorta considerablemente.
squares = []
for i in range(10):
squares.append(i**2)
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2. Procesar una lista de cadenas
Ejemplo de convertir una lista de cadenas a mayúsculas.
words = ["python", "list", "comprehension"]
uppercase_words = [word.upper() for word in words]
print(uppercase_words) # ['PYTHON', 'LIST', 'COMPREHENSION']
La misma operación con un buclefor
sería así.
words = ["python", "list", "comprehension"]
uppercase_words = []
for word in words:
uppercase_words.append(word.upper())
print(uppercase_words) # ['PYTHON', 'LIST', 'COMPREHENSION']
Usando comprensiones de listas, se puede describir el procesamiento de transformación de datos de manera simple.
3. Aplanar una lista (extraer elementos de listas anidadas)
Las comprensiones de listas también son convenientes para convertir listas anidadas (listas bidimensionales) en listas unidimensionales.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
Con un buclefor
normal, se necesitan bucles anidados como sigue.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
for num in row:
flattened.append(num)
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
Se ve que usando comprensiones de listas, se puede describir el anidamiento de bucles de manera simple.
Comparación entre comprensiones de listas y buclesfor
normales
Aspecto | Comprensión de listas | Buclefor normal |
---|---|---|
Brevedad del código | Corta (se puede describir en 1 línea) | Larga (requiere múltiples líneas de código) |
Legibilidad | Simple e intuitiva (fácil de entender para procesos simples) | Fácil de leer cuando es larga, pero tiende a ser redundante |
Velocidad de ejecución | Rápida (debido a la optimización interna de Python) | Ligeramente más lenta (debido al procesamiento explícito del bucle) |
Límite de legibilidad | Se vuelve difícil de leer cuando el anidamiento es profundo | Fácil de organizar incluso con anidamiento profundo |
Básicamente, para procesos simples usar comprensiones de listas, para procesos complejos usar buclesfor
normales es lo mejor.
Resumen
- Las comprensiones de listas son una función conveniente que permite crear listas con sintaxis concisa
- La sintaxis básica es
[expresión for variable in iterable]
- Se puede usar para diversos propósitos como cálculos numéricos, conversión de cadenas, aplanamiento de listas, etc.
- El código se acorta en comparación con bucles
for
normales y la velocidad de procesamiento mejora - Sin embargo, cuando el anidamiento es profundo, la legibilidad disminuye, así que tener cuidado

3. if
con comprensión de listas condicional
En la sección anterior, aprendimos los conceptos básicos de las comprensiones de listas. A partir de aquí, explicaremos cómo combinar las comprensiones de listas con if
para crear listas condicionales.
Al agregar if
a la comprensión de listas, el filtrado de listas se vuelve fácil, y solo se pueden agregar a la lista los elementos que cumplan con condiciones específicas.
Sintaxis básica de comprensión de listas con if
Al crear una lista especificando una condición, la sintaxis básica es la siguiente.
[expresión for variable in iterable if condición]
Elementos de la sintaxis
expresión
: el procesamiento aplicado a cada elementofor variable in iterable
: bucle sobre el iterable (lista, tupla, range, etc.)if condición
: usando la cláusulaif
, agregar a la lista solo si se cumple la condición específica
Ejemplos de uso básicos
1. Extraer solo números pares
Por ejemplo, al almacenar solo los números pares de los enteros de 0 a 9 en una lista, usando un bucle for
normal, sería como sigue.
evens = []
for i in range(10):
if i % 2 == 0:
evens.append(i)
print(evens) # [0, 2, 4, 6, 8]
Usando comprensión de listas, se puede escribir de manera concisa como sigue.
evens = [i for i in range(10) if i % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
→ Al incorporar la cláusula if
en la comprensión de listas, se puede omitir el append()
innecesario, y el código se acorta.
2. Filtrado de lista de cadenas
Usando comprensión de listas, también se pueden extraer solo los elementos que cumplan con condiciones específicas de una lista de cadenas.
Por ejemplo, de entre «python», «java», «c++», «ruby», al almacenar solo los lenguajes de programación con 5 o más caracteres en una lista, se describe como sigue.
languages = ["python", "java", "c++", "ruby"]
long_languages = [lang for lang in languages if len(lang) >= 5]
print(long_languages) # ['python']
3. Extraer palabras que contienen un carácter específico
También se pueden extraer solo las palabras que contienen un carácter específico usando comprensión de listas.
Por ejemplo, para extraer solo las palabras que contienen "a"
, se puede escribir como sigue.
words = ["apple", "banana", "cherry", "date"]
words_with_a = [word for word in words if "a" in word]
print(words_with_a) # ['apple', 'banana', 'date']
Cómo especificar múltiples condiciones
Al especificar múltiples condiciones en la cláusula if
, se pueden usar and
o or
.
1. Extraer solo números pares y múltiplos de 3
filtered_numbers = [i for i in range(20) if i % 2 == 0 and i % 3 == 0]
print(filtered_numbers) # [0, 6, 12, 18]
2. Extraer cadenas que cumplen múltiples condiciones
words = ["python", "java", "c++", "ruby", "go", "haskell"]
filtered_words = [word for word in words if len(word) >= 5 and "o" in word]
print(filtered_words) # ['python']
Errores comunes y soluciones
1. Posición incorrecta de if
❌ Ejemplo incorrecto (posición de if
inapropiada)
numbers = [if i % 2 == 0 for i in range(10)]
Error: SyntaxError: invalid syntax
✔ Ejemplo correcto
numbers = [i for i in range(10) if i % 2 == 0]
2. Uso incorrecto de and
/ or
❌ Ejemplo incorrecto
words = ["apple", "banana", "cherry"]
filtered_words = [word for word in words if len(word) > 5 or "a" in word]
✔ Para obtener el resultado esperado, usar and
filtered_words = [word for word in words if len(word) > 5 and "a" in word]
Resumen
- Al agregar
if
a la comprensión de listas, se pueden almacenar solo los elementos que cumplen la condición en la lista - La sintaxis es
[expresión for variable in iterable if condición]
- Se puede usar para diversos propósitos, como extraer números pares, filtrar cadenas, etc.
- Al especificar múltiples condiciones, aprovechar
and
/or
- Tener cuidado, ya que colocar mal la posición de
if
o la forma de escribir la condición causa errores
4. Notación de comprensión de listas usando if-else
En la sección anterior, aprendimos cómo filtrar elementos de una lista usando if
. Sin embargo, si quieres almacenar valores diferentes en la lista según la condición, necesitas combinar if-else
.
En esta sección, explicaremos en detalle cómo escribir la notación de comprensión de listas usando if-else
y ejemplos prácticos.
Sintaxis básica de la notación de comprensión de listas usando if-else
La sintaxis al incorporar if-else
en la notación de comprensión de listas es la siguiente.
[expresión1 if condición else expresión2 for variable in iterable]
Elementos de la sintaxis
expresión1
: El valor o procesamiento que se aplica cuando se cumple lacondición
condición
: La condición especificada conif
else expresión2
: El valor o procesamiento que se aplica cuando no se cumple lacondición
for variable in iterable
: Procesamiento de bucle en un iterable (lista, rango, etc.)
⚠ ¡Ten cuidado de que al usar if-else
, el if
viene antes del for
!
→ En el caso de solo if
, se escribe después del for
, pero al usar if-else
, se escribe antes del for
.
Ejemplos de uso básicos
1. Mantener los números pares tal cual, convertir los impares a «odd»
Por ejemplo, para almacenar los números pares tal cual en la lista y convertir los impares a «odd» entre los enteros de 0 a 9, con un bucle for
normal sería así.
numbers = []
for i in range(10):
if i % 2 == 0:
numbers.append(i)
else:
numbers.append("odd")
print(numbers)
# [0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']
Usando la notación de comprensión de listas, se puede escribir en una sola línea.
numbers = [i if i % 2 == 0 else "odd" for i in range(10)]
print(numbers)
# [0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']
→ Al usar if
y else
, se puede ver que es posible convertir flexiblemente los valores de la lista.
2. Convertir valores menores o iguales a 0 en «negative»
Por ejemplo, consideremos un procesamiento donde, si los valores numéricos en la lista son menores o iguales a 0, se convierten en "negative"
, y los demás valores numéricos se mantienen tal cual.
numbers = [-5, 3, 0, 8, -2, 7]
modified_numbers = [num if num > 0 else "negative" for num in numbers]
print(modified_numbers)
# ['negative', 3, 'negative', 8, 'negative', 7]
3. Clasificar números por signo positivo o negativo
Por ejemplo, para clasificar los enteros en la lista en «positive» (números positivos) y «negative» (números negativos), se puede escribir así.
numbers = [-10, 15, 0, -5, 20]
categories = ["positive" if num > 0 else "negative" for num in numbers]
print(categories)
# ['negative', 'positive', 'negative', 'negative', 'positive']
Precauciones al usar if-else
en la notación de comprensión de listas
1. No equivocarse en la posición del if
⚠ Ejemplo incorrecto (produce un error)
numbers = [i for i in range(10) if i % 2 == 0 else "odd"]
Error: SyntaxError: invalid syntax
✔ Forma correcta
numbers = [i if i % 2 == 0 else "odd" for i in range(10)]
👉 ¡Al usar if-else
, es necesario describirlo antes del for
!
2. Diferencia entre if-else
y solo if
- Caso de solo
if
(filtrado de elementos)
evens = [i for i in range(10) if i % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
→ En el caso de solo if
, los elementos que no cumplen la condición no se incluyen en la lista.
- Caso de usar
if-else
(conversión de valores)
numbers = [i if i % 2 == 0 else "odd" for i in range(10)]
print(numbers) # [0, 'odd', 2, 'odd', 4, 'odd', 6, 'odd', 8, 'odd']
→ Al usar if-else
, todos los elementos se incluyen en la lista y se convierten según la condición.
Resumen
- Al usar
if-else
, es posible almacenar valores diferentes en la lista según la condición - Al usar
if-else
, descríbelo antes delfor
- A diferencia de la notación de comprensión de listas solo con
if
, es posible incluir todos los elementos en la lista mientras se convierten - Es conveniente para clasificar números y cadenas, o cambiar valores bajo condiciones específicas
- Al usar
if-else
anidado, también es posible combinar múltiples condiciones
5. Listas de comprensión anidadas y bifurcaciones condicionales
En la sección anterior, aprendimos sobre las listas de comprensión usando if-else
. En esta sección, explicaremos el uso de las listas de comprensión anidadas (listas de comprensión que incluyen bucles múltiples).
En las listas de comprensión, al igual que en los bucles for
normales, se pueden usar bucles múltiples (anidados). Esto permite procesar de manera efectiva listas de listas (como listas bidimensionales).
Sintaxis básica de las listas de comprensión anidadas
La sintaxis básica para anidar bucles en una lista de comprensión es la siguiente.
[expresión for variable1 in iterable1 for variable2 in iterable2]
Elementos de la sintaxis
expresión
: El procesamiento aplicado a la variablefor variable1 in iterable1
: El primer buclefor variable2 in iterable2
: El bucle interior (bucle anidado)
Al igual que en los bucles for
normales, el punto clave es que los bucles se ejecutan de izquierda a derecha.
Ejemplos de uso básicos
1. Aplanamiento de una lista bidimensional (aplanado)
Por ejemplo, para convertir una lista bidimensional (lista de listas) en una lista unidimensional, con un bucle for
normal sería así.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
for num in row:
flattened.append(num)
print(flattened)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
Usando una lista de comprensión, se puede describir en una sola línea.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
→ Al aplicar la anidación de bucles a la lista de comprensión, se puede escribir un código más corto e intuitivo.
2. Crear todas las combinaciones
Por ejemplo, para crear todas las combinaciones de A, B, C
y 1, 2, 3
, con un bucle for
normal sería así.
letters = ["A", "B", "C"]
numbers = [1, 2, 3]
combinations = []
for letter in letters:
for number in numbers:
combinations.append(f"{letter}{number}")
print(combinations)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
Usando una lista de comprensión, se puede describir de manera concisa.
letters = ["A", "B", "C"]
numbers = [1, 2, 3]
combinations = [f"{letter}{number}" for letter in letters for number in numbers]
print(combinations)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
→ La capacidad de describir bucles múltiples en una sola línea es la fortaleza de las listas de comprensión anidadas.
Combinar con bifurcaciones condicionales
En las listas de comprensión anidadas, también se pueden incorporar bifurcaciones condicionales usando if
o if-else
.
3. Obtener solo las parejas con suma par
Por ejemplo, para obtener solo las parejas cuya suma sea par entre las combinaciones de 1-3
y 4-6
, con un bucle for
normal sería así.
list1 = [1, 2, 3]
list2 = [4, 5, 6]
pairs = []
for x in list1:
for y in list2:
if (x + y) % 2 == 0:
pairs.append((x, y))
print(pairs)
# [(1, 5), (2, 4), (2, 6), (3, 5)]
Usando una lista de comprensión, se puede escribir de manera corta e intuitiva.
list1 = [1, 2, 3]
list2 = [4, 5, 6]
pairs = [(x, y) for x in list1 for y in list2 if (x + y) % 2 == 0]
print(pairs)
# [(1, 5), (2, 4), (2, 6), (3, 5)]
Precauciones al usar listas de comprensión anidadas
✅ 1. La legibilidad disminuye fácilmente
- Si la anidación es profunda, la legibilidad disminuye, por lo que evite un uso excesivo
- Si prioriza la legibilidad, use un bucle
for
normal
✅ 2. Preste atención a la posición de if
- Si usa solo
if
→ Después defor
- Si usa
if-else
→ Antes defor
✅ 3. Si la anidación es demasiado compleja, conviértala en una función
- Si la anidación es profunda y la legibilidad disminuye, una opción es no usar lista de comprensión y dividirla en una función.
Resumen
- Usar listas de comprensión anidadas permite describir el procesamiento de listas bidimensionales o bucles múltiples de manera concisa
- Al combinar con
if
, se pueden extraer solo los elementos que cumplen la condición - Al combinar con
if-else
, se pueden establecer valores diferentes para cada elemento - Sin embargo, si la anidación es demasiado profunda, la legibilidad disminuye, así que tenga cuidado
6. Mejores prácticas y puntos de atención para la notación de comprensión de listas
La notación de comprensión de listas es una función conveniente que permite escribir código Python de manera más corta, pero dependiendo de cómo se use, puede reducir la legibilidad o empeorar la velocidad de procesamiento.
En esta sección, explicamos las mejores prácticas y puntos de atención para utilizar adecuadamente la notación de comprensión de listas.
Casos en los que se debe usar la notación de comprensión de listas
La notación de comprensión de listas es adecuada para casos como los siguientes.
1. Creación simple de listas
Debido a que la notación de comprensión de listas permite crear listas fácilmente, es muy adecuada para procesos que convierten o extraen elementos de manera simple.
Ejemplo: Elevar cada elemento al cuadrado
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2. Creación de listas condicionales (filtrado)
También es adecuada para extraer solo los elementos que cumplen una condición específica.
Ejemplo: Extraer solo los números pares
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
3. Conversión de listas de cadenas
La notación de comprensión de listas también es conveniente al convertir listas de cadenas.
Ejemplo: Convertir todas las cadenas a mayúsculas
words = ["python", "list", "comprehension"]
uppercase_words = [word.upper() for word in words]
print(uppercase_words) # ['PYTHON', 'LIST', 'COMPREHENSION']
4. Aplanado de listas anidadas
También es útil para convertir listas bidimensionales en unidimensionales.
Ejemplo: Aplanar los elementos de una lista bidimensional
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
Casos en los que no se debe usar la notación de comprensión de listas
La notación de comprensión de listas es conveniente, pero hay casos en los que no es adecuada.
1. La anidación profunda reduce la legibilidad
La notación de comprensión de listas mejora la legibilidad para procesos simples, pero cuando hay bucles múltiples, la legibilidad disminuye.
❌ Mal ejemplo: Notación de comprensión de listas con bucles múltiples
matrix = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
flattened = [num for row in matrix for subrow in row for num in subrow]
👉 La anidación es demasiado profunda y es difícil de entender
✅ Medida de mejora: Usar unfor
bucle normal
flattened = []
for row in matrix:
for subrow in row:
for num in subrow:
flattened.append(num)
2. Escribir procesos largos en notación de comprensión reduce la legibilidad
La ventaja de la notación de comprensión de listas es que se puede escribir de manera simple en una línea, pero si se incluyen procesos complejos, se vuelve difícil de leer.
❌ Mal ejemplo: Notación de comprensión de listas con condiciones complejas
numbers = [x**2 if x % 2 == 0 else x**3 for x in range(10) if x != 5 and x % 3 != 0]
👉 Las condiciones son demasiado complejas y es difícil de leer
✅ Medida de mejora: Usar unfor
bucle
numbers = []
for x in range(10):
if x != 5 and x % 3 != 0:
if x % 2 == 0:
numbers.append(x**2)
else:
numbers.append(x**3)
Rendimiento de la notación de comprensión de listas
1. Es más rápida que elfor
bucle
La notación de comprensión de listas es generalmente más rápida que elfor
bucle.
Debido a la optimización interna de Python, la creación de listas se realiza de manera eficiente.
Comparación de velocidad entrefor
bucle y notación de comprensión de listas
import time
# Comparación con grandes cantidades de datos
data = list(range(10**6))
# Notación de comprensión de listas
start = time.time()
squares = [x**2 for x in data]
print("Notación de comprensión de listas:", time.time() - start)
# Bucle for normal
start = time.time()
squares = []
for x in data:
squares.append(x**2)
print("Bucle for normal:", time.time() - start)
Resultado
- La notación de comprensión de listas tiende a ser más rápida
- Sin embargo, como almacena toda la lista en memoria, el consumo de memoria aumenta con grandes cantidades de datos
2. Para considerar la eficiencia de memoria, utilizar expresiones generadoras
Al manejar grandes cantidades de datos, en lugar de la notación de comprensión de listas, usar «expresiones generadoras» reduce el uso de memoria.
# Notación de comprensión de listas (consume mucha memoria)
squares = [x**2 for x in range(10**6)]
# Expresión generadora (eficiente en memoria)
squares_gen = (x**2 for x in range(10**6))
→ squares_gen
no crea una lista, sino que devuelve un iterador, por lo que ahorra memoria.
Resumen
✅ Casos en los que se debe usar la notación de comprensión de listas
- Creación simple de listas
- Filtrado
- Conversión de cadenas
- Aplanado de listas bidimensionales
❌ Casos en los que se debe evitar la notación de comprensión de listas
- Procesos con anidación profunda
- Procesos con condiciones demasiado complejas
- Casos en los que la legibilidad se reduce extremadamente
💡 Mejores prácticas
- Usar notación de comprensión de listas para procesos simples
- Usar bucles
for
normales para procesos complejos - Seleccionar adecuadamente considerando el rendimiento
7. Preguntas frecuentes (FAQ)
En esta sección, explicamos en detalle las dudas comunes sobre la notación de comprensión de listas y los puntos a tener en cuenta al desarrollar realmente. Incluye puntos donde los principiantes cometen errores y dudas sobre el rendimiento.
Q1. ¿Es posible el filtrado condicional usando if
dos veces?
A1. Sí, es posible, pero hay que prestar atención a la legibilidad.
En la notación de comprensión de listas, se pueden especificar condiciones complejas usando if
dos o más veces.
Ejemplo: Extraer solo los números que cumplen dos condiciones (par y múltiplo de 3)
filtered_numbers = [x for x in range(30) if x % 2 == 0 if x % 3 == 0]
print(filtered_numbers) # [0, 6, 12, 18, 24]
De esta manera, escribir if
de forma continua actúa como una condición AND.
Sin embargo, pensando en la legibilidad, usar and
es más claro.
filtered_numbers = [x for x in range(30) if x % 2 == 0 and x % 3 == 0]
Q2. ¿Cuál usar, la notación de comprensión de listas o el for
normal?
A2. Elegir según la simplicidad del procesamiento y la legibilidad es lo mejor.
La notación de comprensión de listas es extremadamente útil para procesamientos simples, pero en procesamientos complejos, puede disminuir la legibilidad.
Ejemplo: Casos en los que se debe usar un for
normal
# ❌ Difícil de leer en la notación de comprensión de listas
numbers = ["Even" if x % 2 == 0 else "Odd" if x % 3 == 0 else "Other" for x in range(10)]
# ✅ El bucle `for` normal es más claro
numbers = []
for x in range(10):
if x % 2 == 0:
numbers.append("Even")
elif x % 3 == 0:
numbers.append("Odd")
else:
numbers.append("Other")
Q3. ¿Cuál es la diferencia entre usar if-else
y usar solo if
?
A3. Solo if
se usa para filtrado, if-else
para conversión de valores.
✅ Solo if
(obtener solo elementos que cumplen la condición)
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
→ Extrae solo los números pares, los elementos que no cumplen la condición no se incluyen en la lista
✅ if-else
(almacenar valores diferentes según la condición)
labels = ["even" if x % 2 == 0 else "odd" for x in range(10)]
print(labels)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
Q4. ¿La notación de comprensión de listas es más rápida que el for
normal?
A4. Generalmente sí, pero hay que tener cuidado con el consumo de memoria.
La notación de comprensión de listas de Python está optimizada internamente, por lo que actúa más rápido que un for
normal.
⏳ Experimento: Procesar 1 millón de datos
import time
data = list(range(10**6))
# Notación de comprensión de listas
start = time.time()
squares = [x**2 for x in data]
print("Notación de comprensión de listas:", time.time() - start)
# Bucle for normal
start = time.time()
squares = []
for x in data:
squares.append(x**2)
print("Bucle for normal:", time.time() - start)
Resultado
- La notación de comprensión de listas suele ser aproximadamente 30%-50% más rápida
- Sin embargo, como almacena toda la lista en memoria, el consumo de memoria aumenta con grandes cantidades de datos
Medida de mejora (usar generadores)
Al manejar grandes cantidades de datos, usar una expresión de generador en lugar de la notación de comprensión de listas reduce el uso de memoria.
squares_gen = (x**2 for x in data) # () lo convierte en generador
Q5. ¿También hay notación de comprensión para set
o dict
?
A5. Sí, además de listas, hay notación de comprensión para set
(conjuntos) y dict
(diccionarios).
✅ Notación de comprensión para set
(conjunto)
unique_squares = {x**2 for x in range(10)}
print(unique_squares)
✅ Notación de comprensión para dict
(diccionario)
squares_dict = {x: x**2 for x in range(10)}
print(squares_dict)
Resumen
- Es posible usar
if
dos veces, pero usarand
mejora la legibilidad if-else
se usa para convertir valores, soloif
para filtrado- La notación de comprensión de listas es más rápida que el
for
normal, pero con grandes datos hay que tener cuidado con el consumo de memoria - También hay notación de comprensión para
set
ydict
¡Con esto, la explicación sobre la notación de comprensión de listas de Python y las combinaciones con if
está completa! 🎉
¡Por favor, practica escribiendo código real para dominar la notación de comprensión de listas! 🚀