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]中的那些。
答案 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)