8
votes

Meilleur équivalent de ce python imbriqué fou pour boucle

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
The above code is used to create all paths of certain length in a graph.
map[a] represents the points you can reach from point a.How can I change it to simulate having an arbitrary number of loops?This is like a cartesian product (itertools.product) where at each iteration
your choice for the next element is limited to those in map[current_point].

1 commentaires

Eh bien, vous l'avez étiqueté avec récursion .. Avez-vous essayé cela?


3 Réponses :


6
votes
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)

3 commentaires

Je suis désolé d'avoir oublié de mentionner la carte [a] [b] est un entier qui représente la distance entre A à b. Donc, votre solution cesse de fonctionner dès qu'il frappe l'entier. Pouvez-vous me dire comment le changer à un équivalent exact de la boucle imbriquée? Donc, la fonction ne va pas au-delà de la carte [a]. (La carte [x] suffit pour tout point donné x depuis votre choix sur l'endroit où vous pouvez aller à côté d'un certain point ne dépend pas de la façon dont vous y êtes arrivé)


Si la carte [A] [B] est un entier, votre code d'origine ne peut pas fonctionner. Pourriez-vous mettre à jour la question avec un exemple de travail de carte ? Je vais ajouter le type de carte j'ai supposé à cette réponse.


... et éditer la réponse pour fonctionner réellement, car non I ni les 5 UPVOTERS ont remarqué que cela n'a pas ...



3
votes

Ceci est un problème récursif classique. Votre fonction devrait renvoyer la concaténation de la valeur du nœud avec tous les résultats de votre fonction FONCTION pour chaque nœud enfant. Comme vous pouvez le constater dans la phrase, le comportement de fonction est expliqué de manière récursive: xxx

résultat: xxx

Ce code est un point de départ . Vous pouvez stocker tous les chemins dans une liste, utiliser générateur générateur, etc. N'oubliez pas d'empêcher les cercles.

aussi, jetez un oeil à solution igraph . Bien sûr, cette bibliothèque peut vous aider, voir cet exemple: trouve tous les chemins les plus courts (géodésiques) à partir d'un Vertex à tous les autres sommets .

Cordialement.


0 commentaires

1
votes

Tout comme d'autres suggérons, avec récursion: xxx


0 commentaires