我找到了一个很久以前发布的解决方案,我试图将它应用到我的练习中,但它不起作用。 我有一个包含节点和边的类图,以及一个给出节点所有子节点的方法childrenOf。这一切都很好。这是我的DFS搜索代码,我想找到所有路径:
def myDFS(graph,start,end,path=[]):
path=path+[start]
if start==end:
return path
paths=[]
for node in graph.childrenOf(start):
if node not in path:
paths.extend(myDFS(graph,node,end,path))
return paths
我只有空列表。我需要看一下吗?当我在循环中做path = myDFS ...时,我至少有了最后一条路径。我尝试了路径+ = myDFS但没有成功。图表是成功创建的,因此它不是来自它。谢谢
答案 0 :(得分:3)
由于您只想从头到尾获取所有路径,因此路径在到达末尾时会附加到总路径列表中。路径的总列表不会返回,而是填充:
paths = []
def myDFS(graph,start,end,path=[]):
path=path+[start]
if start==end:
paths.append(path)
for node in graph.childrenOf(start):
if node not in path:
myDFS(graph,node,end,path)
答案 1 :(得分:0)
我已平整嵌套字典的JSON(深度为四)
{'output':
'lev1_key1': 'v11',
'lev1_key2': {
{'lev2_key1': 'v21',
'lev2_key2': 'v22',
}
}
递归调用
paths = []
_PATH_SEPARATOR = '/'
def flatten(treeroot, path=''):
path=path
if isinstance(treeroot, dict):
for k in treeroot.keys():
s_path = path + _PATH_SEPARATOR + str(k)
flatten(treeroot[k], path=s_path)
elif isinstance(treeroot, str):
path = path + _PATH_SEPARATOR + treeroot
paths.append(path)
elif isinstance(treeroot, list):
# if node has more than one child
for k in treeroot.keys():
s_path = path + _PATH_SEPARATOR + str(k)
flatten(k, path=s_path)
结果是
{
'output/lev1_key1': 'v11',
'output/lev1_key2/lev2_key1': 'v21',
'output/lev1_key2/lev2_key2': 'v22',
}