2

I have found a solution that was posted some times ago and I have tried to apply it to my exercise but it doesn't work. I have a class graph that has nodes and edges and a method childrenOf that gives all the children of a node. All this works fine. This is my code for the DFS search and I want to find all the paths:

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

I only got empty lists. WHere do I need to look at? When I was doing path=myDFS... in the loop I had at least the last path. I tried path+=myDFS without success. The graph was created with success so it doesn't come from it. Thanks

2 Answers 2

6

Since you only want to get all paths from start to end, the path is appended to your total path list when it reaches the end. The total list of paths is not returned but rather populated:

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)
Sign up to request clarification or add additional context in comments.

Comments

0

i've flattened JSON of nested dicts (depth was four)

{'output':
    'lev1_key1': 'v11',
    'lev1_key2': {
       {'lev2_key1': 'v21',
        'lev2_key2': 'v22',
       }
 }

with recursive call of

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)

result is

{
 'output/lev1_key1': 'v11',
 'output/lev1_key2/lev2_key1': 'v21',
 'output/lev1_key2/lev2_key2': 'v22',
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.