Asignación de eventos en Python

Alexis Roda alexis.roda.villalonga en gmail.com
Jue Jul 24 18:09:16 CEST 2008


En/na Joan Pallarès ha escrit:
> Comprobado
> 
> He copiado tu código tal cual y me devuelve:
> 
> [0, 1, 2]
> [0, 1, 3]
> 
> fenómenos paranormales? no creo, debe ser el compilador o que se te ocurre?
> tengo Python 2.5, y lo ejecuto desde Eclipse bajo Windows XP (no me
> critiqueis mucho xD)

Efectivamente, no funciona con python 2.5, sí lo hace con el 2.4. El 
problema parece estar relacionado con el uso de iter() en las funciones 
genDisponible y generaSoluciones. Aquí tienes código que funciona en 
ambas versiones:


def genDisponible(m, e, p) :
     ncols = len(m[0])
     res = []
     for i in xrange(ncols - 1, -1, -1) :
         if i not in e and m[p][i] :
             res.append(i)
     return res


def generaSoluciones(matriz) :
     nfilas = len(matriz)
     ncols = len(matriz[0])
     estado = [-1] * nfilas
     disponible = [ None ] * nfilas
     fila = 0
     disponible[fila] = genDisponible(matriz, estado, fila)
     while True :
         while not disponible[fila] :
             estado[fila] = -1
             fila -= 1     # retrocede
             if fila < 0 : # no hay mas soluciones
                 raise StopIteration()
         estado[fila] = disponible[fila].pop()
         fila += 1
         if fila >= nfilas :
             yield list(estado)
             fila -= 1
         else :
             disponible[fila] = genDisponible(matriz, estado, fila)


 > Entiendo perfectamente lo que es backtracking, y sí, es una buena idea lo
 > que me dices de las funciones next y prev pero en el caso real que voy a
 > utilizar este algoritmo sera una matriz de 100x100 o incluso más y no 
se si
 > será del todo eficiente calcular todas las soluciones de golpe.

Porque te empeñas en que el algoritmo calcula todas las soluciones de 
golpe ? La función generaSoluciones, y por extensión la clase 
Soluciones, solamente calcula UNA SOLUCIÓN CADA VEZ.

Mira el código con más atención y verás que generaSoluciones es una 
función generadora. Después relee la respuesta que te mando Cristina Yenyxe.

 > Sería mejor
 > generar una a una según las pidiera el usuario (pero claro no se 
hacerlo).

La clase Soluciones hace justamente eso:

 >>> s = Soluciones(parejas)
 >>> s._encontrado
[]  # no se ha encontrado ninguna solucion
 >>> s.next()
[0, 1, 2]
 >>> s._encontrado
[[0, 1, 2]] # una solucion encontrada
 >>> s.next()
[0, 1, 3]
 >>> s._encontrado
[[0, 1, 2], [0, 1, 3]] # dos soluciones encontradas
 >>> s.next()
[0, 2, 1]
 >>> s._encontrado
[[0, 1, 2], [0, 1, 3], [0, 2, 1]]
 >>> s.prev()
[0, 2, 1]
 >>> s.prev()
[0, 1, 3]

hay que afinar un poco los métodos next() y prev(), pero como ejemplo ya 
vale.



Saludos
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es