나는 곡식에 맞서 갈 것이다. 그리고 곧은 편평한 dict이 이것을 위해 최선이 아니라고 말한다.
알파벳순이 아니며 숫자가 아닌 100 개의 정류장과 경로가 있다고 가정 해 보겠습니다. 이제
시도하고 FDR 라 Fourche 사이의 시간을 계산하는 직선 파이썬 딕셔너리를 사용 : 파리 지하철은 생각 하는가? 여기에는 둘 이상의 다른 경로와 여러 옵션이 포함됩니다.
tree 또는 어떤 형태의 graph이 더 나은 구조입니다. dict는 1 대 1 매핑에 대해 훌륭합니다. 트리는 서로 관련이있는 노드에 대한 풍부한 설명을 제공합니다. 그런 다음이를 탐색하기 위해 Dijkstra's Algorithm과 같은 것을 사용할 것입니다.
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<mt:
mt=t
mpath=path
e1=' '.join('{}->{}:{}'.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')
인쇄 :
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
시도해 보셨습니까? 작동 했나요? 이것은 이상한 질문처럼 보입니다. 당신은 그것을 염두에 두는 방법이 있습니다. 시도해보십시오. 개선이 필요하다고 생각되거나 문제가 생길 경우 여기 [code review] (http://codereview.stackexchange.com/)에 게시하십시오. –
사전은 이러한 종류의 작업에 충분해야합니다. 예 –
데이터를 어떻게 사용 하시겠습니까? 정류장의 순서가 의미가있는 경우 일반 사전은 작동하지 않습니다. –