2

我找到了一个前段时间发布的解决方案,我试图将它应用到我的练习中,但它不起作用。我有一个具有节点和边的类图和一个方法 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... 时,我至少有最后一条路径。我试过 path+=myDFS 没有成功。该图是成功创建的,因此它不是来自它。谢谢

4

2 回答 2

6

由于您只想获取从头到尾的所有路径,因此当路径到达末尾时,该路径将附加到您的总路径列表中。不返回路径的总列表,而是填充:

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)
于 2013-05-24T18:55:27.807 回答
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',
}
于 2018-10-22T13:53:05.390 回答