Dictionary best data structure for train routes?

后端 未结 6 1185
北海茫月
北海茫月 2020-12-02 01:08

So I\'ve been tasked with essentially reading in a file (notepad file) that has a bunch of train stops and the time it takes to get from one stop to another. For example it

6条回答
  •  旧时难觅i
    2020-12-02 01:30

    I will go against the grain -- and say that a straight flat dict is not the best for this.

    Let's say you have 100 stops and multiple routes that are non-alphabetical and non-numeric. Think the Paris subway:

    Paris Subway

    Now try and use a straight Python dict to calculate the time between FDR and La Fourche? That involves two or more different routes and multiple options.

    A tree or some form of graph is a better structure. A dict is fabulous for a 1 to 1 mapping; tree are better for a rich description of nodes that relate to each other. You would then use something like Dijkstra's Algorithm to navigate it.

    Since a nested dict of dicts or dict of lists IS a graph, it is easy to come up with a recursive example:

    def find_all_paths(graph, start, end, path=[]):
            path = path + [start]
            if start == end:
                return [path]
            if start not in graph:
                return []
            paths = []
            for node in graph[start]:
                if node not in path:
                    newpaths = find_all_paths(graph, node, end, path)
                    for newpath in newpaths:
                        paths.append(newpath)
            return paths       
    
    def min_path(graph, start, end):
        paths=find_all_paths(graph,start,end)
        mt=10**99
        mpath=[]
        print '\tAll paths:',paths
        for path in paths:
            t=sum(graph[i][j] for i,j in zip(path,path[1::]))
            print '\t\tevaluating:',path, t
            if t{}:{}'.format(i,j,graph[i][j]) for i,j in zip(mpath,mpath[1::]))
        e2=str(sum(graph[i][j] for i,j in zip(mpath,mpath[1::])))
        print 'Best path: '+e1+'   Total: '+e2+'\n'  
    
    if __name__ == "__main__":
        graph = {'A': {'B':5, 'C':4},
                 'B': {'C':3, 'D':10},
                 'C': {'D':12},
                 'D': {'C':5, 'E':9},
                 'E': {'F':8},
                 'F': {'C':7}}
        min_path(graph,'A','E')
        min_path(graph,'A','D')
        min_path(graph,'A','F')
    

    Prints:

        All paths: [['A', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'D', 'E']]
            evaluating: ['A', 'C', 'D', 'E'] 25
            evaluating: ['A', 'B', 'C', 'D', 'E'] 29
            evaluating: ['A', 'B', 'D', 'E'] 24
    Best path: A->B:5 B->D:10 D->E:9   Total: 24
    
        All paths: [['A', 'C', 'D'], ['A', 'B', 'C', 'D'], ['A', 'B', 'D']]
            evaluating: ['A', 'C', 'D'] 16
            evaluating: ['A', 'B', 'C', 'D'] 20
            evaluating: ['A', 'B', 'D'] 15
    Best path: A->B:5 B->D:10   Total: 15
    
        All paths: [['A', 'C', 'D', 'E', 'F'], ['A', 'B', 'C', 'D', 'E', 'F'], ['A', 'B', 'D', 'E', 'F']]
            evaluating: ['A', 'C', 'D', 'E', 'F'] 33
            evaluating: ['A', 'B', 'C', 'D', 'E', 'F'] 37
            evaluating: ['A', 'B', 'D', 'E', 'F'] 32
    Best path: A->B:5 B->D:10 D->E:9 E->F:8   Total: 32
    

提交回复
热议问题