Foros del Web » Programando para Internet » Python »

¿Cambiar el step de un range o generador en tiempo de ejecución?

Estas en el tema de ¿Cambiar el step de un range o generador en tiempo de ejecución? en el foro de Python en Foros del Web. Hola! Me gustaría saber si es posible realizar esto. Es decir, en un ciclo for (o un generador) cambiar el paso o step en tiempo ...
  #1 (permalink)  
Antiguo 14/07/2015, 13:44
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
¿Cambiar el step de un range o generador en tiempo de ejecución?

Hola!

Me gustaría saber si es posible realizar esto. Es decir, en un ciclo for (o un generador) cambiar el paso o step en tiempo de ejecución. He mirado por encima el modulo itertools. Pero no se si hay alguna funcion que lo haga.

Seria poder hacer algo como esto: (Que la variable fuera modificando el step en cada pasada. O una sola vez como en el ejemplo):

Código Python:
Ver original
  1. step = 2
  2.  
  3. for x in range(1, 20, step):
  4.     print(x)
  5.     step = 4 # en este caso se habria modificado en 4

Incluso poder modificar la variable step (dentro del bucle for) con un random.randint(a, b).

Se trataria de ir dando saltos en el ciclo. Pero claro, manteniendo el ultimo valor de la variable de control como referencia. Esto se podria aplicar tambien a los generadores. Osea, que no fuera siempre el mismo paso.
  #2 (permalink)  
Antiguo 14/07/2015, 14:34
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: ¿Cambiar el step de un range o generador en tiempo de ejecución?

¿Probaste hacer eso con un while?

Saludos
__________________
Grupo Telegram Docker en Español
  #3 (permalink)  
Antiguo 15/07/2015, 11:23
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: ¿Cambiar el step de un range o generador en tiempo de ejecución?

Cita:
Iniciado por Carlangueitor Ver Mensaje
¿Probaste hacer eso con un while?

Saludos
Si. Pero no es lo que busco. Supongo que con un while seria algo asi:

Código Python:
Ver original
  1. import random
  2. num = 1
  3. while num <= 25:
  4.     print(num)
  5.     num += random.randint(1, 25)

Código Python:
Ver original
  1. 1
  2. 2
  3. 6
  4. 7
  5. 9
  6. 12
  7. 14
  8. 16
  9. 19
  10. 24

Aunque la duda va a enfocada cuando se trabaja con tuplas o listas. Cuando se trabaja con matrices se puede hacer lo anterior (con un while), ya que llamamos a los vectores por el indice. Pero claro, si las matrices tienen muchos vectores necesita muchos recursos.

Por ejemplo, en este caso:

Código Python:
Ver original
  1. objetos = ('casa', 'lampara', 'mesa', 'armario', 'silla')
  2.  
  3. for enum, x in enumerate(itertools.combinations(objetos, 3), 1):
  4.     print(enum, x)

Y su resultado:

Código Python:
Ver original
  1. 1 ('casa', 'lampara', 'mesa')
  2. 2 ('casa', 'lampara', 'armario')
  3. 3 ('casa', 'lampara', 'silla')
  4. 4 ('casa', 'mesa', 'armario')
  5. 5 ('casa', 'mesa', 'silla')
  6. 6 ('casa', 'armario', 'silla')
  7. 7 ('lampara', 'mesa', 'armario')
  8. 8 ('lampara', 'mesa', 'silla')
  9. 9 ('lampara', 'armario', 'silla')
  10. 10 ('mesa', 'armario', 'silla')

¿Como conseguir, por ejemplo, que de forma aleatoria y respetando la secuencia nos diera...?

Código Python:
Ver original
  1. 1 ('casa', 'lampara', 'mesa')
  2. 5 ('casa', 'mesa', 'silla')
  3. 9 ('lampara', 'armario', 'silla')

Ya digo que esto es un pequeño ejemplo y se puede conseguir facilmente con arreglos. Pero imagina que las combinaciones fueran 1000, 5000 o mas. No es viable tener un arreglo tan grande.

Por otro lado, con arreglo seria asi:

Código Python:
Ver original
  1. objetos = ('casa', 'lampara', 'mesa', 'armario', 'silla')
  2. matriz = []
  3. for enum, x in enumerate(itertools.combinations(objetos, 3), 1):
  4.     matriz.append(x)
  5.     print(enum, x)
  6.    
  7.  
  8. num = 0
  9. while num <= 10:    
  10.     print((matriz[num]))
  11.     num += random.randint(1, 5)

Código Python:
Ver original
  1. ('casa', 'lampara', 'mesa')
  2. ('casa', 'lampara', 'armario')
  3. ('casa', 'lampara', 'silla')
  4. ('casa', 'mesa', 'armario')
  5. ('casa', 'mesa', 'silla')
  6. ('casa', 'armario', 'silla')
  7. ('lampara', 'mesa', 'armario')
  8. ('lampara', 'mesa', 'silla')
  9. ('lampara', 'armario', 'silla')
  10. ('mesa', 'armario', 'silla')
  11. Resultado:
  12. ('casa', 'lampara', 'mesa')
  13. ('casa', 'lampara', 'armario')
  14. ('lampara', 'mesa', 'armario')
  15. ('mesa', 'armario', 'silla')

Lo que trato de hacer, es no tener que crear el arreglo. Osea, que un generador, un while o un for nos devuelda el vector por medio de su indice aleatorio. Pero respetendo la secuencia aleatoria de menor a mayor.

Última edición por Koan; 15/07/2015 a las 11:45
  #4 (permalink)  
Antiguo 15/07/2015, 19:55
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: ¿Cambiar el step de un range o generador en tiempo de ejecución?

Cita:
Iniciado por Koan Ver Mensaje
Ya digo que esto es un pequeño ejemplo y se puede conseguir fácilmente con arreglos. Pero imagina que las combinaciones fueran 1000, 5000 o mas. No es viable tener un arreglo tan grande.
Eso es porque todavía mantienes un enfoque de todo en un arreglo.

Lo que yo haría:
1. Obtener el numero de combinaciones en un arreglo de longuitud n (esto es sencillo y rápido).
2. Generar números aleatorios entre 1 y nCr (esto también es sencillo y rápido)
3. Para cada uno de esos números aleatorios obtener la n-esima combinación (esto también es -wait for it- sencillo y rápido).
  #5 (permalink)  
Antiguo 16/07/2015, 10:21
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: ¿Cambiar el step de un range o generador en tiempo de ejecución?

Cita:
Iniciado por razpeitia Ver Mensaje
Eso es porque todavía mantienes un enfoque de todo en un arreglo.

Lo que yo haría:
1. Obtener el numero de combinaciones en un arreglo de longuitud n (esto es sencillo y rápido).
2. Generar números aleatorios entre 1 y nCr (esto también es sencillo y rápido)
3. Para cada uno de esos números aleatorios obtener la n-esima combinación (esto también es -wait for it- sencillo y rápido).
A ver si me voy aclarando...

Un generador en Python no contiene todas las combinaciones en memoria. Por lo que las va generando en tiempo real. Al no tener un indice cada combinacion, no se puede llamar de forma selectiva a cada uno de ellas. Como si se haria con un arreglo.

Es decir, en un generador no se le puede pedir que nos devuelva la combinacion ubicada en las posiciones: 1, 4, 56, 34, 500, 560, etc...

Y en una matriz no podemos 'guardar' trillones de vectores.

Por ejemplo ¿Como guardar 1.61358778796735e+27 de combinaciones en una matriz?

200 numeros en 20 grupos

Código Python:
Ver original
  1. import math
  2. math.factorial(200) / (math.factorial(200 - 20) * math.factorial(20))

Resultado:

Código Python:
Ver original
  1. 1.61358778796735e+27

¿Como puedo decirle? De 1.61358778796735e+27 devuelveme las que te pido segun su posicion ordenada. Pero ¡Ojo!, que no recorra todas ellas para devolver las solicitadas. Ya que de ese modo, podria tardar una semana en darmelas.



Es que no se si estamos hablando de lo mismo

¡Saludos!

Última edición por Koan; 16/07/2015 a las 10:30

Etiquetas: generador, range, tiempo
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 10:24.