2012-01-18 38 views
8
for a in map: 
    for b in map[a]: 
     for c in map[b]: 
      for d in map[c]: 
       for e in map[d]: 
        print a+b+c+d+e 

El código anterior se utiliza para crear todas las rutas de cierta longitud en un gráfico. mapa [a] representa los puntos que puede alcanzar desde el punto a.Mejor equivalente de esta pitón alocada alocada para el bucle

¿Cómo puedo cambiarlo para que simule tener un número arbitrario de bucles?

Esto es como un producto cartesiano (itertools.product) donde en cada iteración su elección para el próximo elemento está limitada a aquellos en el mapa [current_point].

+2

Bueno, hemos marcado con recursividad .. ¿trató eso? – wim

Respuesta

6
map = { 
    'a': ['b', 'c'], 
    'b': ['c', 'd'], 
    'c': ['d', 'a'], 
    'd': [] 
} 

def print_paths(map, start, length, prefix = ''): 
    if length == 0: 
     print prefix 
    else: 
     for a in map[start]: 
      print_paths(map, a, length - 1, prefix + start) 

for a in map.keys(): 
    print_paths(map, a, 5) 
+1

Lo siento, olvidé mencionar el mapa [a] [b] es un número entero que representa la distancia entre a a b. Entonces, su solución deja de funcionar tan pronto como alcanza el número entero. ¿Puede decirme cómo cambiarlo a un equivalente exacto del ciclo anidado? Entonces la función no va más allá del mapa [a]. (el mapa [X] es suficiente para cualquier punto dado X ya que su elección sobre a dónde puede ir después de un cierto punto no depende de cómo llegó allí) – Babak

+0

Si el mapa [a] [b] es un número entero, su original el código no puede funcionar. ¿Podría actualizar la pregunta con un ejemplo de trabajo de 'map'? Agregaré el tipo de 'mapa' que asumí a esta respuesta. –

+0

... y edite la respuesta para que realmente funcione, ya que ni yo ni los 5 videntes notamos que no ... –

3

Este es un problema recursivo clásico. Su función debe devolver la concatenación del valor del nodo con todos los resultados de su función resultado para cada nodo secundario. Como se puede ver en la oración, el comportamiento de la función se explica de una manera recursiva:

myGraph = { 1:[2,3], 2:[3,4] } 

def recorre(node_list, p = ''):  
    for node in node_list: 
     if node in myGraph and myGraph[node]: 
      recorre(myGraph[node], p+unicode(node)) 
     else: 
      print p+unicode(node) 

recorre(myGraph) 

Resultado:

>>> recorre(myGraph) 
123 
124 
13 
23 
24 

Este código es un punto de inicio. Puede almacenar todas las rutas en una lista, use el generador yield, etc. No se olvide de evitar círculos.

Además, eche un vistazo a igraph solution. Seguro que esta biblioteca puede ayudarte, mira este ejemplo: Finds all shortest paths (geodesics) from a vertex to all other vertices.

Atentamente.

1

Al igual que otros sugirieron, la recursividad:

distances = []   

    def compute_distance(map, depth, sum): 
     if depth == 0 or len(map) == 0: 
      distances.append[sum] 
     else: 
      for a in map: 
       compute_distance(map[a], depth - 1, sum + a) 

    compute_distance(map, x, 0) 
Cuestiones relacionadas