Foros del Web » Programando para Internet » Python »

Compresión y filtrado de una lista con random.randint

Estas en el tema de Compresión y filtrado de una lista con random.randint en el foro de Python en Foros del Web. Hola! Estoy probando las listas comprimidas y el filtrado de las mismas. Pensaba crear una lista con valores numéricos que hiciera de filtro. Luego, en ...
  #1 (permalink)  
Antiguo 19/10/2014, 01:48
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Compresión y filtrado de una lista con random.randint

Hola!

Estoy probando las listas comprimidas y el filtrado de las mismas. Pensaba crear una lista con valores numéricos que hiciera de filtro. Luego, en la lista comprimida se crearían números aleatorios con random.randint filtrados por la primera lista.

Ejemplo:

Código Python:
Ver original
  1. filtro = [1,2,3,10]

Código Python:
Ver original
  1. filtrada = [random.randint(1,20) for i in range(10) if not i in filtro]

Código Python:
Ver original
  1. >>> filtrada
  2. [18, 8, 3, 15, 5, 3, 8]

Pero como podéis ver, no funciona. Ya que aparece el número 3 que esta en la lista filtro. Por lo tanto, no se hasta que punto de códigos se puede poner en las listas comprimidas. O si deben ser códigos simples.

En el ejemplo, la salida debería ser una lista de 10 números del 1 al 20. Y que entre ellos no estuviera ni el 1,2,3 y el 10. Algo hago mal...
  #2 (permalink)  
Antiguo 19/10/2014, 03:47
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: Compresión y filtrado de una lista con random.randint

El filtro lo aplicas al range, no al número aleatorio.

Código Python:
Ver original
  1. filtrada = [random.randint(1,20) for i in range(10) if not i in filtro]

Es lo mismo que:
Código Python:
Ver original
  1. filtrada = [random.randint(1,20) for i in(0,4,5,6,7,8,9)]

Saludos.
  #3 (permalink)  
Antiguo 19/10/2014, 11:01
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: Compresión y filtrado de una lista con random.randint

Ok. Sigo probando, pero ahora me da error de sintaxis. Con listas comprimidas he realizado cosas básicas. Y claro, quería aprender bien lo que se puede y no se puede hacer.

Código Python:
Ver original
  1. import random
  2. filtro = [1,2,3,4]
  3. filtrada = [i for i in range(10) for j in range(random.randint(1,20)) if not j in filtro]

Pero me sale esto:

Código Python:
Ver original
  1. >>> filtrada
  2. [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9]

Lo que yo quiero es que me dé números aleatorios y que no sean el 1,2,3,4. Osea, de la lista filtro.

Resumiendo...

Me gustaría saber si esto se puede hacer con una lista comprimida/filtrada:

Código Python:
Ver original
  1. import random
  2. filtro = [1,2,3,4]
  3. for i in range(10):
  4.     a = random.randint(1,20)
  5.     if not a in filtro:
  6.         filtrada.append(a)

Si ejecutáis el código, nunca sale el 1,2,3 o 4. Que es lo que quiero.

Última edición por Koan; 19/10/2014 a las 11:26
  #4 (permalink)  
Antiguo 19/10/2014, 11:31
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Compresión y filtrado de una lista con random.randint

Veo varios errores:

1. No son listas comprimidas, es list comprehension, comprehension como comprensión del verbo comprender y no comprimir.

2. Esto tiene sus pros y sus contras.
Código Python:
Ver original
  1. filtro = [1,2,3,10]
  2. filtrada = [random.randint(1,20) for i in range(10) if not i in filtro]

Esto lo puedes reescribir como
Código Python:
Ver original
  1. filtro = [1,2,3,10]
  2. filtrada = []
  3. for i in range(10):
  4.     if not i in filtro:
  5.         filtrada(random.randint(1,20))

Como puedes ver no hay manera de determinar si `random.randint(1,20)` esta en tu lista de filtrados, al menos usando esta forma.

Puedes hacerlo igual de fácil usando map y filter.
Código Python:
Ver original
  1. filtrada = filter(lambda x: x not in filtro, map(lambda x: random.randint(1, 20), range(10)))

O usando generadores + comprensión de listas
Código Python:
Ver original
  1. filtrada = [j for j in (random.randint(1,20) for i in range(10)) if j not in filtro]

3. Tu segundo código lo puedes reescribir como:
Código Python:
Ver original
  1. import random
  2. filtro = [1,2,3,4]
  3. filtrada = []
  4. for j in range(random.randint(1,20)):
  5.     for i in range(10):
  6.         if not j in filtro:
  7.             filtrada.append(i)
Como puedes ver, no tiene mucho sentido con lo que tratas de hacer.
  #5 (permalink)  
Antiguo 19/10/2014, 12:09
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: Compresión y filtrado de una lista con random.randint

Cita:
Iniciado por razpeitia Ver Mensaje
Puedes hacerlo igual de fácil usando map y filter.
Precisamente estas dos funciones (junto con 'reduce' que se haya en un módulo aparte) evito utilizarlas. Ya que según leí desaconsejan utilizarlas a favor de las lista por comprensión. Osea, que se sustituyen en favor a las listas por comprensión y filtrado.

Por cierto, me quedo con la forma de generador + comprensión de lista. Me parece las mas elegante y limpia. Más zen. La opción 3 ya la descarto por ser código. Es decir, ya no es lista por comprensión. Y la primera me parece mas liada y con demasiadas funciones de por medio.

Muchas gracias!

Última edición por Koan; 19/10/2014 a las 12:16
  #6 (permalink)  
Antiguo 19/10/2014, 12:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Compresión y filtrado de una lista con random.randint

Cita:
Iniciado por Koan Ver Mensaje
Precisamente estas dos funciones (junto con 'reduce' que se haya en un módulo aparte) evito utilizarlas.
map, filter y reduce se encuentran dentro de las funciones built-in que ofrece python 2, en python 3 reduce no se encuentra por default.

Cita:
Iniciado por Koan Ver Mensaje
Ya que según leí desaconsejan utilizarlas a favor de las lista por comprensión.
Osea, que se sustituyen en favor a las listas por comprensión y filtrado.
map, filter y reduce no se encuentran deprecadas.

No se donde hayas leído eso, pero probablemente leíste mal o interpretaste mal.

http://stackoverflow.com/questions/1...hension-vs-map
http://stackoverflow.com/questions/5...on-style-guide

Si, recomiendan comprensión de listas, en ciertas ocasiones. Pero aquí falla porque necesitas hacer mas operaciones con ese parámetro.
  #7 (permalink)  
Antiguo 19/10/2014, 13:13
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: Compresión y filtrado de una lista con random.randint

Cita:
Iniciado por razpeitia Ver Mensaje

map, filter y reduce no se encuentran deprecadas.

No se donde hayas leído eso, pero probablemente leíste mal o interpretaste mal.
Eso lo he leído en el libro 'Python para todos'. En el capítulo de Compresión de listas. Comentan que 'reduce' pasa a formar parte del módulo functools. Y 'map' y 'filter' se desaconsejaran a favor de las list comprehensions.

He de decir que yo utilizo Python 3, claro.

Etiquetas: lista
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:09.