更好地相当于这个疯狂的嵌套python for循环

时间:2012-01-18 06:58:22

标签: python recursion generator nested-loops

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

上面的代码用于在图表中创建一定长度的所有路径。 map [a]表示从a点可以到达的点。

如何更改它以模拟具有任意数量的循环?

这就像每次迭代时的笛卡尔积(itertools.product) 您对下一个元素的选择仅限于map [current_point]中的那些。

3 个答案:

答案 0 :(得分: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 :(得分:3)

这是一个经典的递归问题。您的函数应返回节点值的连接以及每个子节点的函数结果的所有结果。正如您在句子中看到的那样,函数行为以递归方式解释:

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 )

结果:

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

此代码是一个起点。您可以将所有路径存储在列表中,使用yield生成器等。不要忘记阻止圈子。

另外,请查看igraph solution。当然这个库可以为您提供帮助,请参阅此示例:Finds all shortest paths (geodesics) from a vertex to all other vertices

问候。

答案 2 :(得分:1)

就像其他建议一样,使用递归:

    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)