No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

List Comprehension

6/44
Recursos

Aportes 137

Preguntas 22

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Ejemplo de los días con letra ‘a’

for :

days = ["lunes", "martes", "miercoles", "jueves", "viernes", "sabado", "domingo"]
newlist = []

for i in days:
  if "a" in i:
    newlist.append(i)

print(newlist) #["martes", "sabado"]

List Comprehension

days = ["lunes", "martes", "miercoles", "jueves", "viernes", "sabado", "domingo"]

newlist = [i for i in days if "a" in i]

print(newlist) # ["martes", "sabado"]

List Comprehension

Si quieren cambiarle el nombre a una variable que esta en varias partes del código

.
Basta con poner el cursos al comienzo de esa variable, presionar Ctrl + F2 y luego F2. Te saldra un cuadrito de texto pidiendo el nuevo nombre:
.

.
el cambio se aplicara en todas las variables con el mismo nombre.
.

Comprensión de lista:

  • Es una lista que tiene por contenido una operación en vez de una lista de conjuntos, y estas operaciones se realizan con un for para poder iterar y sacar los datos de la lista, y esta lista tiene la siguiente forma:

También podemos buscar si hay ciertos elementos dentro la lista con el comando “in” de la siguiente manera, “Elemento a buscar - in - nombre de la lista”.

Wow, sí que facilita la legibilidad del código.

Así tomé mis apuntes en Word:
Yo cómo entiendo esto? Como si tuviese una cantidad de gallinas, y quisiera ver una gallina una a una detalladamente y hacerle algo una a cada a una. Para hacer esto, sé cuántas gallinas tengo, se lo digo en el RANGE(1,11) pues estamos diciendo que tiene diez gallinas, por lo que le estoy diciendo que tendrá que tomar gallina una a una diez veces distintas. La escritura del código sería “Gallina a Gallina”, que en inglés es igual a “Gallina for Gallina”, o “Element for Element”. Asi que el código le dice que tome gallina a gallina en un rango del 1 al 10 a través de: element for element in range [1,11].
Ya la manera de lenguaje se torna más literal y me gusta.

Qué chulada la de Python

A lo que vine a este curso, a empaparme de list comprehensions

Otra clase que es una maravilla:

list_v1 = []

for i in range(1,11):
  list_v1.append(i * 2)

print(list_v1)

list_v2 = [i * 2 for i in range(1,11)]
print(list_v2)


list_v3 =[i * 2 for i in range(1,101) if i % 3 == 0]
print(list_v3)

Esta clase me frustró un poco porque no entendia toda esta rama de los Comprehensions, le pregunté a chatGPT que me diera una definicion y me dio esto
Las comprehensions de Python son una forma concisa y legible de crear listas, conjuntos y diccionarios en una sola línea de código. La sintaxis básica de las comprehensions es la siguiente:

Lista comprehension: [expresión for elemento in iterable]
Conjunto comprehension: {expresión for elemento in iterable}
Diccionario comprehension: {clave: valor for elemento in iterable}

Espero les sirva 😃

En el 2021, a fines, estudié con otro profesor y me hizo entenderlo de este forma:

element for element in range(1, 11)

Para cada element dentro del rango del 1 al 11, voy a agregarle un element

i * 2 for i in range(1, 11) if i % 2 == 0

Para cada i en el rango del 1 al 11, voy a agregarle una i multiplicada por 2, solo y cuando i % 2 sea igual a 0

List Comprehension

En Python, las comprensiones (comprehensions) son una forma concisa y elegante de construir una nueva lista, conjunto o diccionario a partir de otra colección de datos utilizando una sintaxis compacta.

Existen tres tipos de comprensiones en Python:

Comprehensions de lista

La comprensión de lista (list comprehension) es una forma de construir una nueva lista a partir de otra lista o cualquier otra colección de datos iterable. Su sintaxis es la siguiente:

nueva_lista = [expresion for elemento in iterable if condicion]

  • expresion: es una expresión que define cómo se deben transformar los elementos originales.
  • elemento: es una variable que toma los valores de cada elemento de la colección original.
  • iterable: es una colección de datos iterable, como una lista, tupla o conjunto.
  • condicion (opcional): es una condición que filtra los elementos de la colección original.

Por ejemplo, para crear una nueva lista que contenga el cuadrado de los números pares de una lista original, podemos usar una comprensión de lista de la siguiente manera:

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
cuadrados_pares = [x**2 for x in numeros if x%2 == 0]
print(cuadrados_pares)  # Salida: [4, 16, 36, 64, 100]

Algunos ejemplos de más, espero les guste:

**El código **

    one = [ x**2 for x in [1,2,3] ]
    #[1,4,9]

    two = [ x/2 for x in [4,5,6,7,2,7,3,8,2] if x > 5 ]
    #[3.0, 3.5, 3.5, 4.0]

    three = [ f'{x}_{x}' for x in 'Tu nombre aquí']
    #['T_T', 'u_u', ' _ ', 'n_n', 'o_o', 'm_m', 'b_b', 'r_r', 'e_e', ' _ ', 'a_a', 'q_q', 'u_u', 'í_í']

    four = [ f'{x}_{x}' for x in 'Quitamos los espacios' if x!= ' ']
    #['Q_Q', 'u_u', 'i_i', 't_t', 'a_a', 'm_m', 'o_o', 's_s', 'l_l', 'o_o', 's_s', 'e_e', 's_s', 'p_p', 'a_a', 'c_c', 'i_i', 'o_o', 's_s']

    text = 'The powerful of python'
    five = [ord(x) for x in text]
    #[84, 104, 101, 32, 112, 111, 119, 101, 114, 102, 117, 108, 32, 111, 102, 32, 112, 121, 116, 104, 111, 110]

    sixe = [(x + 5 if x > 4 else x -10) for x in range(1,11)]
    #[-9, -8, -7, -6, 10, 11, 12, 13, 14, 15]

    seven = ["Python3"[i::-1] for i in range(7)]
    #['P', 'yP', 'tyP', 'htyP', 'ohtyP', 'nohtyP', '3nohtyP']
    ma = [1,2,3,4,5]
    mb = [6,7,8,9,0]
    eight = [x*y for x in ma for y in mb]
    #[6, 7, 8, 9, 0, 12, 14, 16, 18, 0, 18, 21, 24, 27, 0, 24, 28, 32, 36, 0, 30, 35, 40, 45, 0]
    
    nine = [[x for x in range(y+2)] for y in range(4)]
    #[[0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]

Hice un ejemplo usando nombres de participantes de una carrera y filtre a aquellos que tengan la letra n (ya sea minúscula o mayúscula).

#Hagamos un ejemplo diferente: Supongamos que queremos hacer una lista de los nombres de todos los participantes de una carrera pero sólo de aquellos que tengan la letra N
race_participants = ["Juan", "Maricela", "Pedro", "Erick", "Betzabet", "Carlos", "Nicolas", "Ramon", "Mabel", "Stan", "Diana"]

#Veamoslo de una forma intuitiva primero
n_names = []

for name in race_participants:
  if "n" in name.lower():
    n_names.append(name)

print(n_names)

#Ahora, hagamoslo con list comprehension
n_names_2 = [name for name in race_participants if "n" in name.lower()]

print(n_names_2)

Se siente muy satisfactorio cuando luego un tiempo atras ver esa chorrera de cosas impactaba no poder saber que era y que ahora haces esa chorrera y la puedes leer:
Disfruten el aprendizaje ya que ese es el valor de la clave : exito 😂 (like si captaste el sublime):

Tambien podemos tener un else dentro dentro de list comprehension, aqui la sintaxis my\_list = \[ i if i < 1 else 2 for i in range(1, 8) ] print(my\_list)

tuve que ver varias veces esta clase. definitivamente leer la sintaxis es un poco complejo para nosotros lo principiantes, pero una vez que logras comprender da una gran satisfacción.

Love you

List Comprehension permite a través de una sintaxis corta crear una nueva lista basada en los valores de una lista existente.

Agradezco mucho la simplicidad con la que explicas el uso de
"for" para mi fue una función muy difícil de entender y contigo queda demasiado claro.

List comprenhension La comprensión de listas ofrece una sintaxis más corta cuando desea crear una nueva lista basada en los valores de una lista existente. <https://github.com/angel20125/python-2-comprehension-functions-2024> ![](https://static.platzi.com/media/user_upload/clase-6-list-comprehension-a4938212-ee51-41f8-bf07-002d1ca0b9d6.jpg)

Aquí hay algunos ejercicios para reforzar este concepto => https://www.w3schools.com/python/python_lists_comprehension.asp

Hola les comparto un pequeño código que hice para solucionar un code chalenge.

básicamente el reto era ingresar 3 números, el cuarto lo guardamos en n, había que guardar en una lista de listas las combinaciones de los 3 números que su suma fuera diferente a n, con este ejercicio me quedo mucho más claro el tema de lists comprehensions.

x = int(input())
y = int(input())
z = int(input())
n = int(input())
    
permutations = [[i,j,k] for i in range(0,x+1) for j in range(0,y+1) for k in range(0,z+1) if i+j+k != n]
    
print(permutations)

Hola. aqui aprendiste el concepto de List Comprehension y como se crea mas no para que se usa y porque deberias usarlo.
CONCEPTO: el concepto de List comprehension es que es una nueva estructura de datos en Python mas avanzada que te permite agrupar una linea de codigo en algo mas legible y compacta en tu programa.
COMO SE CREA: variable = [i for i in iterable] #ejemplo

tu podrias crear la linea de codigo asi:

lista = []

for num in range(1,20):
    lista.append(num*2)
print(lista)    

se lee: Creamos una lista vacia que va a contener los valores recorridos por el ciclo for en el rango de 1 a 20 que seran llamados num, la lista vacia va a agregar a cada uno de esos numeros devueltos como multiplicacion en 2
y finalmente se emprime la lista.

todo eso lo puedes hacer (sin tener necesidad de escribir append).

lista = [num*2 for num in range(1,20)]
print(lista)

y es exacatamente lo mismo.

Pero digamos en caso tal que tenga varias condiciones, 7 por ejemplo, creo que al final tendríamos una línea de código muy larga, y para leer la línea sería complejo no?. Para usar la list comprehension depende del contexto, porque también puede ser mejor la forma tradicional

hace algún tiempito aprendí List Comprehension.
La verdad es que es una buena manera de hacer el código legible.
Procuro usarlo seguido.

hola:

#estructura con condicion: [element for element in iterable if condition]
#Forma tradicional:
print('Forma Tradicional:')
numbers = [] 
for i in range(1,11):
  if i % 2 == 0:
    numbers.append(i *2)

print(numbers)
print('-'*10)
#Forma de list comprehension
print('Forma con list comprehension:')
numbers_v2 = [i *2 for i in range(1,11) if i % 2 == 0]
print(numbers_v2)
print('-'*10)

List Comprehension

[element for element in iterable]

  • Element: variable que se va a agregar a la lista
  • For: ciclo for que va a recorrer el iterable
  • Iterable: objeto que se va a recorrer, puede ser una lista, tupla, diccionario, etc
# List Comprehension
numbers = [element for element in range(0, 101)]
print(numbers)

Un aporte extra

'''
numbers = []
for element in range(1, 11):
  numbers.append(element * 2)

print(numbers)


numbers_v2 = [element * 2 for element in range(1, 11)] # iterar un rango con menos lineas de codigo y legibles
print(numbers_v2)
'''
numbers = []
for i in range(1, 11):
  if i % 2 == 0:
    numbers.append(i * 2)

print(numbers)

numbers_v2 = [i * 2 for  i in range(1, 11) if i % 2 == 0]
print(numbers_v2)


Para obtener los números que son múltiplos de 5 menores a 50

numbers_m5 = []
for i in range(1, 50):
  if i % 5 == 0:
    numbers_m5.append(i)
print(numbers_m5)

List Comprehension

numbers_m5 = [i for i in range(1, 50) if i % 5 == 0]
print(numbers_m5) 

Ya lo había visto en la documentación gracias Profe Nico, mucho mas claro.

Notas de clase

numbers = []
for element in range(1, 11):
  numbers.append(element*2)
print(numbers)

#Utilizando List Comprehension
numbers_v2 = [element*2 for element in range(1,11)]
print(numbers_v2)

#con condicional
numbers = []
for i in range(1, 11):
  if i % 2 == 0:
    numbers.append(i)
print(numbers)

#Utilizando List Comprehension
numbers_v2 = [i for i in range(1,11) if i % 2 == 0]
print(numbers_v2)
# Se crea una lista con una list comprehension; en donde, se recorre un rango de 10 números.
# Se comprueba que estos numeros sean divisibles por tres.
# Se eleva al cuadrado el numero final y se guarda en la lista
my_list: list = [i ** 2 for i in range(1,11) if i % 3 == 0]
print(my_list)

countries = {“MX”, “COL”, “ARG”, “USA”}
northAm = {“USA”, “CANADA”}
centralAm = {“MX”, “GT”, “BZ”}
southAm = {“COL”, “BZ”, “ARG”}

new_set = set(countries | northAm | centralAm | southAm)

print(new_set)

#Saludos Nicolas Molina

mi ejercicio de prueba:

pares = []
for par in range(1, 101):
  if par % 2 == 0:
    pares.append(par)
print(pares)

#list comprehention
imparess = [impares for impares in range(1, 101) if impares % 2 != 0]
print(imparess)

Use un metodo para crear un nuevo array con nombres que no empezaran con la letra “d”.

arr = ["daniel", "daria","jose","ernesto"]

 newArr = [element for element in arr if not element.startswith("d")]

OUTPUT:
["jose", "ernesto"]

Realmente se me hace dificil entenderlo por el momento 😢

Les comparto este pequeño reto para practicar list comprehensions:

Crear un set con los números del 1 al 1000, y mostrar los números que son divisibles entre 7 pero no entre 5.:


– Posible respuesta:

def div():
  list = [x for x in range(1,1001)]
  list2 = [x for x in list if x % 7 == 0 and x % 5 != 0]
  set1 = set(list2)
  return set1

print(div(), end=" ")

Excelente explicación 👏👏👏

```js numbers = [] for element in range(1, 11): numbers.append(element) print(numbers) numbers_v2 = [element for element in range(1, 11)] print(numbers_v2) numbers_v3 = list(range(1, 11)) print(numbers_v3) ```numbers = \[] for element in range(1, 11): numbers.append(element) print(numbers) numbers\_v2 = \[element for element in range(1, 11)] print(numbers\_v2) numbers\_v3 = list(range(1, 11)) print(numbers\_v3)
```js impares = [i for i in range (1, 101) if i % 2 !=0 ] ```Wow!
List comprenhension La comprensión de listas ofrece una sintaxis más corta cuando desea crear una nueva lista basada en los valores de una lista existente. ![](https://static.platzi.com/media/user_upload/clase-6-list-comprehension-e4947177-fc00-4514-9831-777e582c4fec.jpg)
**List Comprehension** **Sintaxis básica:** La comprensión de listas en Python tiene una sintaxis muy específica.  Se ve así: **\[expression for item in list]**. Aquí, expression es cualquier operación válida de Python que se realiza en cada item de la list. **Condicionales:** Puedes agregar condicionales al final de la expresión para filtrar elementos.  Por ejemplo: **\[expression for item in list if condition]**. \# Lista original original\_list = \[1, 2, 3, 4, 5, 6] \# Usando comprensión de listas para crear una nueva lista que contiene solo los números pares de la lista original even\_numbers = \[num for num in original\_list if num % 2 == 0] print(even\_numbers)  # Salida: \[2, 4, 6] **Condicionales anidados:** También puedes tener múltiples condiciones anidadas.  Por ejemplo: **\[expression for item in list if condition1 if condition2].** numbers = \[1, 2, 3, 4, 5, 6, 7, 8, 9] \# Usando condicionales anidados para filtrar números que son mayores que 2 y menores que 8 filtered\_numbers = \[num for num in numbers if num > 2 if num < 8] print(filtered\_numbers)  # Salida: \[3, 4, 5, 6, 7] **If-Else en la expresión:** Puedes usar un if-else en la expresión para decidir qué valor tomar.  Por ejemplo: **\[expression1 if condition else expression2 for item in list].** numbers = \[1, 2, 3, 4, 5, 6, 7, 8, 9] \# Usando if-else en la expresión para marcar los números pares e impares mark = \["par" if num % 2 == 0 else "impar" for num in numbers] print(mark)  # Salida: \['impar', 'par', 'impar', 'par', 'impar', 'par', 'impar', 'par', 'impar'] **Bucles anidados:** Puedes anidar múltiples bucles.  Por ejemplo: **\[expression for item1 in list1 for item2 in list2].** list1 = \[1, 2, 3] list2 = \['a', 'b', 'c'] \# Usando bucles anidados para obtener todas las combinaciones posibles de list1 y list2 combinations = \[(num, letter) for num in list1 for letter in list2] print(combinations)  # Salida: \[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')] **Evita las listas largas:** Las comprensiones de listas son geniales, pero pueden consumir mucha memoria si la lista es muy larga. En esos casos, es mejor usar un generador. **Legibilidad:** Aunque las comprensiones de listas pueden hacer mucho en una sola línea, a veces puede ser mejor dividir las cosas en varias líneas para mejorar la legibilidad.
Esta practica muestro el uso del tercer elemento. ![](https://static.platzi.com/media/user_upload/Captura%20desde%202024-05-22%2018-33-42-69c0b94d-ab29-45d6-8a03-ec7d2bc029cd.jpg) ![](https://static.platzi.com/media/user_upload/Captura%20desde%202024-05-22%2018-35-07-bf5cf347-d8dc-4ab7-847b-c27e691c5daf.jpg) En este ejercicio elevo al cuadrado el numero y a su vez lo sumo por el mismo, en range podemos notar que comienza la secuencia comienza en 1 y termina el 20, aumentando de uno en uno. Me pareció super genial
Me gusta mucho este tipo de clases, ya que podrian verse como simples trucos para ahorrarnos lineas de codigo, sin embargo estoy seguro que a la hora de una entrevista tecnica, usar este tipo de sintaxis mas cortas es algo que se evalua para determinar si sos buen candidato o no.
Pueden ir revisando los apuntes y codigo de la clase en mi notebook de colab: <https://colab.research.google.com/drive/1XbUq9YDWbE_rUiAoZ5avI5e6ftpMBw6N?usp=sharing>
Las **list comprehensions** son una herramienta poderosa en Python para crear listas de manera concisa y eficiente. Permiten generar elementos de lista a partir de iterables y aplicar condiciones utilizando una sintaxis similar a la de los bucles `for`. **Anidando List Comprehensions:** Al igual que los bucles `for`, las **list comprehensions** se pueden anidar para crear estructuras de datos más complejas. Esto significa que podemos utilizar una **list comprehension** dentro de otra para generar elementos que dependen de los resultados de la iteración anterior. **Ejemplo:** Considere el siguiente problema: queremos generar una lista de listas, donde cada sublista contiene las coordenadas `(x, y)` de todos los puntos dentro de un rectángulo definido por sus dimensiones `ancho` y `alto`. ```js ancho = 5 alto = 3 # Ejemplo de una list comprehension anidada coordenadas = [[x, y] for x in range(ancho) for y in range(alto)] print(coordenadas) ```**Explicación:** 1. La primera **list comprehension** itera sobre el rango de `ancho`, generando valores de `x` de 0 a `ancho - 1`. 2. Dentro de la primera **list comprehension**, se encuentra una segunda que itera sobre el rango de `alto`, generando valores de `y` de 0 a `alto - 1`. 3. Para cada combinación de `x` e `y`, se crea una sublista `[x, y]` que representa las coordenadas de un punto dentro del rectángulo. 4. La lista final `coordenadas` contiene todas las sublistas generadas, representando así el conjunto de coordenadas dentro del rectángulo. **Ventajas:** Las **list comprehensions** anidadas ofrecen varias ventajas sobre el uso de bucles `for` anidados para generar estructuras de datos complejas: 1. **Concisión:** La sintaxis de las **list comprehensions** es más compacta y expresiva que la de los bucles `for` anidados, lo que mejora la legibilidad del código. 2. **Eficiencia:** Las **list comprehensions** se implementan de manera eficiente en Python, lo que las hace comparables en rendimiento a los bucles `for` anidados. 3. **Flexibilidad:** Las **list comprehensions** permiten aplicar condiciones y transformaciones a los elementos generados, similar a lo que se hace con los bucles `for`, pero con una sintaxis más concisa. **Conclusión:** Las **list comprehensions** anidadas son una herramienta poderosa y flexible para crear estructuras de datos complejas en Python. Su sintaxis concisa y expresiva las convierte en una alternativa preferible a los bucles `for` anidados en muchas situaciones.
**Desafío de Nivel Superior** Objetivo: Dada una lista de diccionarios que representan libros, utiliza la comprensión de lista para seleccionar solo los libros publicados después del año 2000 y que tengan más de 300 páginas. La lista resultante debe contener los títulos de estos libros. libros = \[    {"titulo": "Libro A", "año": 1999, "paginas": 250},    {"titulo": "Libro B", "año": 2005, "paginas": 500},    {"titulo": "Libro C", "año": 2020, "paginas": 150},    {"titulo": "Libro D", "año": 2022, "paginas": 350},] saludos!
¡Les comparto un ejercicio para practicar! **Calcular el cuadrado de los números pares:** * Crea una lista con números del 1 al 10. * Crea una nueva lista con el cuadrado de los números pares de la lista original.
Me ha costado, creo que lo tengo
"List Comprehesion" (compresión de listas) es una característica de Python que proporciona una manera concisa y expresiva de crear listas. Permite construir una lista de manera más compacta y legible en una sola línea de código. La sintaxis básica de una "List Comprehension" es la siguiente: NuevaLista = \[expresion for elemento in iterable if condicion] Donde: expresion: es la expresión que se evalúa y agrega a la nueva lista. elemento: es la variable que toma los valores del iterable. iterable: es una secuencia, como una lista, tupla, cadena, etc. condicion: (opcional) es una condición que determina si se incluye o no el elemento en la nueva lista. A continuación, un ejemplo sencillo para ilustrar la "List Comprehension": *#Crear una lista de cuadrados de los npumeros del 0 al 9* **<u>cuadrados = \[x\*\*2 for x in range(10)]</u>** **<u>print(cuadrados)</u>** Este código crea una lista llamada "cuadrados" que contiene los cuadrados de los números del 0 al 9. La salida será: \[0,1,4,9,16,25,36,49,64,81] Se puede utilizar "List Comprehension" para filtrar elementos o realizar transformaciones en una lista de manera más eficiente y legible que usando bucles convencionales. Es una herramienta poderosa y versátil en Python
```js def old_way_create_list(range_min, range_max): print("Executing createList(range_min:=>", range_min, ", range_max:=>", range_max, ")") numbers = [] for element in range(range_min, range_max): if(element % 2 == 0): numbers.append(element*2) list_show(numbers) def new_way_create_list(range_min, range_max): print("Executing new_way_create_list(range_min:=>", range_min, ", range_max:=>", range_max, ")") numbers = [element*2 for element in range(range_min, range_max) if element % 2 == 0] list_show(numbers) def list_show(list): print(list) def main(): range_min, range_max = 1, 11 old_way_create_list(range_min, range_max) new_way_create_list(range_min, range_max) main() ```
```js def old_way_create_list(range_min, range_max): print("Executing createList(range_min:=>", range_min, ", range_max:=>", range_max, ")") numbers = [] for element in range(range_min, range_max): if(element % 2 == 0): numbers.append(element*2) list_show(numbers) def new_way_create_list(range_min, range_max): print("Executing new_way_create_list(range_min:=>", range_min, ", range_max:=>", range_max, ")") numbers = [element*2 for element in range(range_min, range_max) if element % 2 == 0] list_show(numbers) def list_show(list): print(list) def main(): range_min, range_max = 1, 11 old_way_create_list(range_min, range_max) new_way_create_list(range_min, range_max) main() ```def old\_way\_create\_list(range\_min, range\_max): print("Executing createList(range\_min:=>", range\_min, ", range\_max:=>", range\_max, ")") numbers = \[] for element in range(range\_min, range\_max): if(element % 2 == 0): numbers.append(element\*2) list\_show(numbers) def new\_way\_create\_list(range\_min, range\_max): print("Executing new\_way\_create\_list(range\_min:=>", range\_min, ", range\_max:=>", range\_max, ")") numbers = \[element\*2 for element in range(range\_min, range\_max) if element % 2 == 0] list\_show(numbers) def list\_show(list): print(list) def main(): range\_min, range\_max = 1, 11 old\_way\_create\_list(range\_min, range\_max) new\_way\_create\_list(range\_min, range\_max) main()
`def old_way_create_list(range_min, range_max):` ` print("Executing createList(range_min:=>", range_min, ", range_max:=>",` ` range_max, ")")` ` numbers = []` ` for element in range(range_min, range_max):` ` if(element % 2 == 0):` ` numbers.append(element*2)` ` list_show(numbers)` `def new_way_create_list(range_min, range_max):` ` print("Executing new_way_create_list(range_min:=>", range_min,` ` ", range_max:=>", range_max, ")")` ` numbers = [element*2 for element in range(range_min, range_max) if element % 2 == 0]` ` list_show(numbers)` `def list_show(list):` ` print(list)` `def main():` ` range_min, range_max = 1, 11` ` old_way_create_list(range_min, range_max)` ` new_way_create_list(range_min, range_max)` `main()`
numbers\_v3 = list(map(lambda x: x \* 2, filter(lambda x: x % 2 == 0, range(1, 11)))) print(numbers\_v3) Aquí otra forma de realizar el ejercicio!!!
![](https://static.platzi.com/media/user_upload/image-3bf005ef-eb27-4784-95c5-a4844184904b.jpg) Terminal ![](https://static.platzi.com/media/user_upload/image-6aa24c5b-e5ae-4b01-8f34-6ed56a300858.jpg)
```python #Crear una lista con elementos que se repiten de dos strings c = 'hello' d = 'world' union_list = [x for x in c if x in d] print(union_list) ```#Crear una lista con elementos que se repiten de dos strings c = 'hello' d = 'world' union\_list = \[x for x in c if x in d] print(union\_list) output: \['l', 'l', 'o']
Pregunta, ¿puedo subir un video explicando esto? Por que creo que lo puedo explicar mucho mejor.
```js numbers = [] for i in range(1, 11): if i % 2 == 0: numbers.append(i) print(numbers) numbers_v2 = [ i for i in range(1, 11) if i % 2 == 0] print(numbers_v2) ```numbers = \[] for i in range(1, 11): if i % 2 == 0: numbers.append(i) print(numbers) numbers\_v2 = \[ i for i in range(1, 11) if i % 2 == 0] print(numbers\_v2)
![](https://static.platzi.com/media/user_upload/image-1a8f106f-ae07-4266-be23-2e5195a3bd14.jpg)Aquì les dejo un ejemplo pràctico :D
```python # No comprehensions numbers = [] for element in range(1, 13): if element % 2 == 0: numbers.append(element * 2) print(numbers) # Comprehensions # Basic With iterable numbers = [el for el in range(1, 13)] print(numbers) # With operation numbers = [el * 2 for el in range(1, 13)] print(numbers) # With condition numbers = [el for el in range(1, 13) if el % 2 == 0] print(numbers) ```# No comprehensions numbers = \[] for element in range(1, 13): if element % 2 == 0: numbers.append(element \* 2) print(numbers) \# Comprehensions \# Basic With iterable numbers = \[el for el in range(1, 13)] print(numbers) \# With operation numbers = \[el \* 2 for el in range(1, 13)] print(numbers) \# With condition numbers = \[el for el in range(1, 13) if el % 2 == 0] print(numbers)
```js ''' #Ejemplo generar una lista con un ciclo for numbers = [] for element in range(1,11): numbers.append(element*2) print(numbers) # Ejemplo con list conprenhentions numbers_v2 = [element * 2 for element in range (1,11) ] print(numbers_v2) ''' #Ejemplo generar una lista con un ciclo for numbers = [] for i in range(1,11): #Si el residuo de la división es igual a cero lo agrega if i % 2 == 0: numbers.append(i*2) print(numbers) # Ejemplo con list conprenhentions, agregando condiciones numbers_v2 = [element * 2 for element in range (1,11) if element % 2 == 0] print(numbers_v2) ```'''#Ejemplo generar una lista con un ciclo fornumbers = \[]for element in range(1,11): numbers.append(element\*2) print(numbers) \# Ejemplo con list conprenhentionsnumbers\_v2 = \[element \* 2 for element in range (1,11) ]print(numbers\_v2)''' \#Ejemplo generar una lista con un ciclo fornumbers = \[]for i in range(1,11): #Si el residuo de la división es igual a cero lo agrega if i % 2 == 0: numbers.append(i\*2) print(numbers) \# Ejemplo con list conprenhentions, agregando condicionesnumbers\_v2 = \[element \* 2 for element in range (1,11) if element % 2 == 0]print(numbers\_v2)

nueva_lista = [expresion for elemento in iterable if condicion]

expresion: Es la expresión que se evalúa y se agrega a la nueva lista.
elemento: Variable que toma cada elemento del iterable.
iterable: La secuencia de elementos sobre la cual iteramos (por ejemplo, una lista, tupla, cadena, etc.).
condicion: Una condición opcional que filtra los elementos antes de agregarlos a la nueva lista.
numbers = []
for i in range(1, 11):
    numbers.append(i)
print(numbers)

numbers = []
numbers = [i for i in range(1, 11)]
print(numbers)

# --------------------------------------------
numbers = []
for i in range(1, 11):
    numbers.append(i*2)
print(numbers)

numbers = []
numbers = [i*2 for i in range(1, 11)]
print(numbers)

# --------------------------------------------
numbers = []
for i in range(1, 11):
    if i % 2 == 0:
        numbers.append(i*2)
print(numbers)

numbers = []
numbers = [i*2 for i in range(1, 11) if i % 2 == 0]
print(numbers)

Me puse a hacer ejercicios de practica sobre list comprehension, y hay algo muy interesante respecto al metodo range(), es su sintaxis, ya que podemos definir su inicio, final y en las partes que uno quiere que se vaya sumando, es decir, podemos crear un rango que vaya del 2 al 10, haciendo pasos de 2:

lista = [i for i in range(2, 10, 2)]
print(lista)
Buena noche. ¿por qué esa estructura con FOR e IN, para recortar la generación de lista? numbers\_v2 = list(range(1, 11)) print(numbers\_v2) esa no sería valida, cual es la diferencia?? Gracias.

Beneficios de utilizar listas vacias como en el ejemplo numbers = []:

  1. Inicialización de estructuras de datos: Puedes usar listas vacías como contenedores para almacenar elementos más tarde. Por ejemplo, al comenzar un programa, puedes declarar una lista vacía y luego agregar elementos dinámicamente a medida que se necesiten.

    mi_lista = []
    # Realizar operaciones y agregar elementos según sea necesario
    mi_lista.append(10)
    mi_lista.append("Hola")
    
  2. Iteración segura: Cuando trabajas con bucles, puedes usar listas vacías para acumular resultados. Esto es útil cuando no conoces de antemano la cantidad de elementos que se agregarán.

    resultados = []
    for elemento in iterable:
        resultado = procesar(elemento)
        resultados.append(resultado)
    
  3. Manejo de excepciones: Puedes utilizar listas vacías para evitar errores cuando esperas recibir una lista pero no estás seguro de si estará vacía o no. Luego, puedes verificar la longitud de la lista antes de realizar operaciones específicas.

    mi_lista = obtener_lista_posiblemente_vacia()
    if len(mi_lista) > 0:
        # Realizar operaciones solo si la lista no está vacía
        procesar_lista(mi_lista)
    
  4. Interpolación dinámica de datos: Puedes construir dinámicamente listas basadas en condiciones o datos variables.

    datos = obtener_datos()
    if condicion:
        mi_lista = datos
    else:
        mi_lista = []
    

Estos son solo algunos ejemplos, pero en general, el uso de listas vacías proporciona flexibilidad y modularidad al escribir código en Python. Permiten adaptarse dinámicamente a diferentes situaciones y construir estructuras de datos según sea necesario.

List Comprehension en Python: Una Explicación Detallada

La List Comprehension en Python es una forma concisa y expresiva de crear listas. Es una construcción sintáctica que te permite crear listas de manera más compacta, legible y eficiente que usando bucles tradicionales.

Sintaxis Básica:

La estructura general de la List Comprehension es:

[nueva_expresion for elemento in iterable if condicion]
  • nueva_expresion: La expresión que define cómo se va a transformar cada elemento del iterable.
  • elemento: La variable que toma el valor de cada elemento en el iterable.
  • iterable: La secuencia de elementos (por ejemplo, una lista, tupla o rango) a través de la cual iteramos.
  • condicion (opcional): Una condición que filtra los elementos del iterable, solo se incluyen en la nueva lista si la condición es True.

Ejemplos para ilustrar:

<h5>1. Crear una Lista de Cuadrados:</h5>
# Usando bucle tradicional
cuadrados = []
for i in range(1, 6):
    cuadrados.append(i**2)

# Usando List Comprehension
cuadrados_comp = [i**2 for i in range(1, 6)]

print(cuadrados)      # Output: [1, 4, 9, 16, 25]
print(cuadrados_comp)  # Output: [1, 4, 9, 16, 25]
<h5>2. Filtrar Números Pares:</h5>
# Usando bucle tradicional
pares = []
for i in range(1, 11):
    if i % 2 == 0:
        pares.append(i)

# Usando List Comprehension
pares_comp = [i for i in range(1, 11) if i % 2 == 0]

print(pares)      # Output: [2, 4, 6, 8, 10]
print(pares_comp)  # Output: [2, 4, 6, 8, 10]

Características Clave:

  1. Concisión y Legibilidad:

    • La List Comprehension puede hacer que el código sea más breve y fácil de entender, especialmente para operaciones simples.
  2. Eficiencia:

    • En general, la List Comprehension puede ser más eficiente en términos de velocidad de ejecución que los bucles tradicionales.
  3. Versatilidad:

    • Puedes utilizar List Comprehension no solo para crear listas, sino también para conjuntos y diccionarios.
  4. Anidamiento:

    • Es posible anidar List Comprehensions, permitiéndote realizar operaciones más complejas.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

En resumen, la List Comprehension es una característica poderosa y expresiva de Python que puede mejorar la claridad y eficiencia de tu código al crear y transformar listas de manera concisa.

`ingredientes = ['tomate', 'pepino', 'lechuga', 'chinola', 'limon', 'agua', 'sal', 'jitomate']` `new_list = [x for x in ingredientes if "e" in x]` `print(new_list)`
Una clase muy chévere no sabía nada de eso, pensé que ya sabía de python pero que va! Aquí mi ejercicio XD ![](https://static.platzi.com/media/user_upload/List%20comprehesion-02c88cf7-2436-45c3-bb5b-013f1e3780bd.jpg)
```python #Pt 1 numbers = [] for element in range(1,11): numbers.append(element*2) print(numbers) numbers_v2 = [element*2 for element in range(1,11)] print(numbers_v2) # Pt 2 numbers = [] for i in range(1,11): if i % 2 ==0: numbers.append(i*2) print(numbers) numbers_v2 = [i*2 for i in range(1,11) if i % 2 ==0] print(numbers_v2) ```

Me gusto este ejecicio con respecto al aprendizaje de usar comprehensions. No sabia que su trabajo simplificado hace esto mas sencillo.

List comprehensions

💡 Nota:

  • El if es completamente opcional
  • Se lee “Para cada elemento en el iterable, guardo el elemento en la lista, si se cumple la condición”
LIMIT = 100
squares = [i**2 for i in range(1,LIMIT+1) if i %3 != 0 ]
print(squares)

Encontré un pequeño reto en esta newsletter []https://www.linkedin.com/pulse/abre-tu-mente-y-tus-corchetes-descubre-la-magia-de-en-jesus-daniel/?trackingId=ny0LsYMAT8S9oKiFFfNYTw%3D%3D

  1. Crea una lista de los números impares del 1 al 20 utilizando “List Comprehension”.
  2. Dada una lista de nombres, crea una nueva lista con los nombres que comiencen por la letra “A”.
  3. Crea una lista de los primeros 10 números de la sucesión de Fibonacci utilizando “List Comprehension”.
# 1 Respuesta
odd = [i for i in range(1, 21) if not i % 2 == 0]
print(odd)
# 2 Respuesta
names = ["Angela", "Martha", "Antonia"]
nameA = [i for i in names if i.startswith("A")]
print(nameA)
# 3 Respuesta
fibo = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
print(len(fibo))
first10 = [x for x in fibo[:10]]
print(first10)

Los hice con colores

#Primero
colors = ['green', 'blue', 'yellow', 'red', 'orange', 'pink', 'purple', 'gray']
colors_v2 = []
for element in colors:
    if 'e' in element:
        colors_v2.append(element)
print(colors_v2)

#Segundo
colors = ['green', 'blue', 'yellow', 'red', 'orange', 'pink', 'purple', 'gray']
colors_v2 = [element for element in colors if 'e' in element]
print(colors_v2)

Python 🔥

Las List Comprehensions (Comprensiones de Listas) son una característica poderosa y compacta en Python que te permite crear listas de manera concisa utilizando una sola línea de código. Son especialmente útiles cuando deseas aplicar una operación o una transformación a cada elemento de una secuencia (como una lista) y crear una nueva lista basada en esos elementos transformados. Las List Comprehensions se componen de tres partes clave:
[expresión for elemento in iterable if condición]

  1. Expresión: La expresión que se evalúa para cada elemento de la secuencia y se utiliza para crear los elementos de la nueva lista.
  2. Secuencia de Origen: La secuencia de la cual se toman los elementos para aplicar la expresión. Puede ser una lista, una cadena, una tupla o cualquier otro iterable.
  3. Filtros (opcional): Puedes agregar filtros condicionales para seleccionar solo los elementos que cumplan ciertas condiciones.

A continuación, te mostraré algunos ejemplos de List Comprehensions para que puedas comprender mejor cómo funcionan:

Ejemplo 1: Crear una lista de cuadrados de números del 0 al 9:

pythonCopy code
cuadrados = [x ** 2 for x in range(10)]
# cuadrados contendrá [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ejemplo 2:` Filtrar números pares de una lista:

pythonCopy code
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pares = [x for x in numeros if x % 2 == 0]
# pares contendrá [2, 4, 6, 8, 10]

Ejemplo 3: Crear una lista de palabras con más de 3 letras:

pythonCopy code
palabras = ["hola", "Python", "es", "genial"]
mas_de_tres_letras = [palabra for palabra in palabras if len(palabra) > 3]
# mas_de_tres_letras contendrá ["hola", "Python", "genial"]

Ejemplo 4: Convertir una lista de temperaturas de grados Celsius a Fahrenheit:

pythonCopy code
celsius = [0, 10, 20, 30, 40]
fahrenheit = [(c * 9/5) + 32 for c in celsius]
# fahrenheit contendrá [32.0, 50.0, 68.0, 86.0, 104.0]

Las List Comprehensions son una forma elegante y legible de crear listas y aplicar transformaciones a los elementos de una secuencia. Son ampliamente utilizadas en Python y te ayudan a escribir código más conciso y eficiente.

numbers2 = [i for i in range(1,11) if i % 2 == 0]
print(numbers2)

😊🍏
Comparto mi código donde utilizo List Comprehension
para ubicar a los alumnos destacados y notas destacadas del diccionario.

alumnos_notas = {
    "carlos" : 20,
    "Diego" : 17,
    "Erick" : 17,
    "Angelo" : 19,
    "Gabriela" : 18,
    "Ana" : 15
}

#De forma clasica
alumnos_destacados_1 = []

for alumno, notas in alumnos_notas.items():
    if notas > 17:
        alumnos_destacados_1.append(alumno)

print(alumnos_destacados_1) #['carlos', 'Angelo', 'Gabriela']

#Utilizando List Comprehension, alumnos destacados
alumnos_destacados_2 = [alumno for alumno, nota in alumnos_notas.items() if nota > 17]

print(alumnos_destacados_2) #['carlos', 'Angelo', 'Gabriela']

#Utilizando List Comprehension, notas destacadas
tercio_superior = [notas for notas in alumnos_notas.values() if notas > 17] 
print(tercio_superior) # [20, 19, 18]

numbers_v2 = list(range(21, 31))
print(numbers_v2)
Esta operacion me sale el mismo resultado les comparto

Resoviendo un ejercicio con List Comprehensions

Estoy practicando y busque en internet ejercicios de algoritmos para yo resolverlos con lo que estoy aprendiendo en Python. Al terminar esta clase me di cuenta que pude resolver más fácil un algoritmo que ya había hecho, así que regrese e hice una segunda versión.
El ejercicio es:

🚨 Desarrolle un algoritmo que lea los primeros 300 números enteros y determine cuántos de ellos son impares; al final deberá indicar su sumatoria.

Mi versión Inicial era:

sum = 0
for i in range(1, 301):
    if (i / 2) - float(i // 2) == 0.5:
        print(i)
        sum = sum + i

print('La sumatoria de los números inpares del 1 al', i, 'es 👉', sum)

Mi versión con List Comprehension es:

suma = 0
impares = [i for i in range(1, 301) if i % 2 != 0]
for n in impares:
    suma = suma + n

print(impares, 'La sumatoria de los números inpares del 1 al', i, 'es 👉', suma)

Conclusiones: al parecer son casi las misma lineas de código pero… en list comprehensions es más sencillo de leer, además al desplegar los resultados en pantalla, se logra de una forma más ordenada.

Pueden revisar en mi GitGub los ejercicios que voy realizando

https://github.com/josealpantoja/ejercicios_algoritmos_python/

Si quieren practicar, aqui les dejo los ejercicios de algoritmos Aquí 🤓

List comprehension - Chat Gpt


La comprensión de listas (list comprehension en inglés) es una característica poderosa de Python que te permite crear listas de manera concisa y elegante utilizando una sintaxis compacta. Es especialmente útil cuando deseas aplicar una operación o filtrar elementos en una lista existente para crear una nueva lista.

La sintaxis básica de una comprensión de listas es la siguiente:

nueva_lista = [expresion for elemento in lista_original if condicion]

Donde:

  • expresion es el resultado que se agrega a la nueva lista para cada elemento que cumple con la condicion.
  • elemento es cada elemento de la lista_original que se está procesando.
  • condicion es una expresión opcional que filtra los elementos de la lista_original antes de aplicar la expresion.

Aquí hay algunos ejemplos para ilustrar cómo funcionan las comprensiones de listas:

  1. Creación de una lista de cuadrados:
numeros = [1, 2, 3, 4, 5] 
cuadrados = [x ** 2 for x in numeros] 
# Resultado: [1, 4, 9, 16, 25]
  1. Filtrado de elementos pares:
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
pares = [x for x in numeros if x % 2 == 0] 
# Resultado: [2, 4, 6, 8, 10]
  1. Creación de una lista de pares (x, y):
x_vals = [1, 2, 3] 
y_vals = [10, 20, 30] 
pares = [(x, y) for x in x_vals for y in y_vals] 
# Resultado: [(1, 10), (1, 20), (1, 30), (2, 10), (2, 20), (2, 30), (3, 10), (3, 20), (3, 30)]
  1. Uso de expresiones condicionales:
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
resultado = [x if x % 2 == 0 else "impar" for x in numeros] 
# Resultado: ['impar', 2, 'impar', 4, 'impar', 6, 'impar', 8, 'impar', 10]

Las comprensiones de listas son una forma compacta y legible de crear listas y realizar transformaciones en los elementos. Sin embargo, debes tener cuidado de no exagerar en la complejidad de la expresión para mantener la legibilidad. Si la comprensión se vuelve demasiado complicada, podría ser más adecuado utilizar un enfoque más tradicional con bucles y condiciones separados.

Dejo mi aporte:

numbers_v1,1 = []
for element in range(1,11):
  numbers.append(element)

print(numbers_v1,1) R// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Estas cansado de hacer esto y que tu código sea enorme
# Pues mira esto...

numbers_v1,2 = [element for element in range(1, 11)]
print(numbers_v1,2) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Presentando los List Comprehension. Una sintaxis que permite escribir ciclos iterables
# EN UNA SOLA LINEA DE CÓDIGO

# Y tambien tiene un plus...

numbers_v2,1 = []
for i in range(1,11):
  if i % 2 == 0:
    numbers.append(i * 2)

print(numbers_v2,1) # Estamos multiplicando un número solo si su módulo por 2 es igual a 0
# Esta es la manera tradicional...

numbers_v2,2 = [i*2 for i in range(1, 11) if i % 2 == 0] # Y esta es nuestra versión
#                |   _________|_________   ______|______  
#                |            |            Y este es el plus...
#                |            |            la condición
#Este es        _|            |           
# el elemento  |  Este es el ciclo de donde
# a iterar     |  sacamos el elemento

numeros = []
for elementos in range(1,11):
numeros.append(elementos)
print(elementos * 2)

numeros_V2 = [elementos for elementos in range(1,11)]
print(numeros_V2)

numeros2 = []
for i in range(1,11):
if i % 2 == 0:
numeros2.append(i*2)
print(numeros2)

numeros_v = [i*2 for i in range (1,11) if i%2 ==0]
print(numeros_v)

En esta estructura, expresión es el valor que se agrega a la nueva lista y elemento representa cada elemento de la secuencia (como una lista, una cadena de texto, una tupla, etc.).

  • En cada iteración, la expresión se evalúa usando el valor actual del elemento y se agrega a la nueva lista.
  • Después de completar todas las iteraciones, la lista resultante se asigna a una variable.

Interesante el concepto de list comprehensions.

Acota mucho el codigo, sin embargo, cuando aplicamos el zen de python en algunas ocaciones siguiendo el criterio de que espaciado es mejor que denso, podriamos optar por el camino largo para que sea mas compresnsible para quien interpreta el codigo.

Aquí un ejemplo de la compresión de listas:

Esta función toma una lista de cosas y devuelve otra lista donde todo esta en mayúsculas.

Aqui les dejo dos ejemplos que encontré sobre este tema: se trata de listas de varios niveles, o mejor dicho, listas que contienen listas:

  • Dos dimensiones
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_list = [num for row in list_of_lists for num in row ]
print(flattened_list)# [1, 2, 3, 4, 5, 6, 7, 8, 9]
  • Tres dimensiones
# Una lista con listas, que a su vez tiene más listas.
# Lista de 3 niveles
list_of_lists = [ 
                    [ [1,2,3], [4,5,6], [7,8,9] ],
                    [ [2,4,6], [8,10,12], [14,16,18] ] 
                ]

new_list = [element for first_level in list_of_lists
            for second_level in first_level
            for element in second_level]

print(new_list)# [1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Ejemplo

number_v3 = [i for i in range(1, 500) if i % 3 == 0 and i % 5 == 0]

Resultado

[15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345, 360, 375, 390, 405, 420, 435, 450, 465, 480, 495]

Les recomiendo que practiquen !! no es tan dificil yo lo hice con pokemones lo pueden hacer con frutas o lo que sea solo es cogerle el tiro con ejemplos faciles

#mi forma de hacerlo con pokemones , por ejemplo necesito una lista de pokemones que comiencen por la letra A

computadora = ["Ratata", "pikachu","squirtle","charmander","bulbasor","gengar","onix",
              "jinx"]

pokemones = []

for name in computadora:
  if "a" in name.lower():
    pokemones.append(name)

print(pokemones)

#con list comprehension

pokemones2 =[name for name in computadora if "a" in name. lower()]
print(pokemones2)

Tambien se puede aplicar a strings:

fruits = ["apple", "banana", "cherry", "kiwi", "mango"]

newlist = [x for x in fruits if 'a' in x]

print(newlist)

newlist = [expression for item in iterable if condition == True]

numbers =[]
for element in range(1,11):
if element %2 == 0:
numbers.append(element*2)
print(numbers)

numbers_v2 = [element*2 for element in range(1, 11) if element%2 == 0]
print(numbers_v2)

Les comparto la comparación que hice entre la sintaxis tradicional y la sintaxis comprimida, porque yo quería asimilar muy bien la explicación de la estructura de esta última (espero que no les de un mareo 😃):

Cada vez que se utilice range(a,b) el valor b no se imprime, en cambio se imprime b-1, ejemplo: usando range(1,16) entonces el ultimo valor que se imprime será 15.

Ejercicios para practicar:
1: list comprehensión de 20 números random
2: list comprehensión de 20 números random pares

Solución
aleatorio = [random.randint(1, 100) for _ in range(21)]
print(aleatorio)

num_par_random = [
num for num in [random.randint(1, 100) for _ in range(1, 20)] if num % 2 == 0
]
print(num_par_random)