[英]trying to find all the path in a graph using DFS recursive in Python
我找到了一個很久以前發布的解決方案,我試圖將它應用到我的練習中,但它不起作用。 我有一個包含節點和邊的類圖,以及一個給出節點所有子節點的方法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但沒有成功。 圖表是成功創建的,因此它不是來自它。 謝謝
由於您只想從頭到尾獲取所有路徑,因此路徑在到達末尾時會附加到總路徑列表中。 路徑的總列表不會返回,而是填充:
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)
我已經將嵌套dicts的JSON弄平了(深度為4)
{'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',
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.