【发布时间】:2016-03-09 23:46:23
【问题描述】:
我正在尝试计算图中从节点start 到另一个end 的最短路径。我一直在阅读 + 运算符应用于列表,将元素连接到前者的末尾,结果创建了一个新列表。而使用.extend() 不仅可以将元素添加到列表的末尾,还可以保持相同的列表实例。
我不明白为什么如果我使用path = path + [start] 我的代码可以工作,而不是如果我使用path.extend(start)。我不认为每次调用函数时都需要创建一个新列表来返回正确的结果。
def shortest_path_edge_num(graph, start, end, path = None, shortest = None):
if (graph or start or end) is None: return None
if path is None: path = []
if shortest is None:
shortest = []
path = path + [start]
# path.extend([start])
# Base case:
if start == end: return path
for adj_node in graph[start]:
if adj_node[0] not in path:
new_path = shortest_path_edge_num(graph, adj_node[0], end, path, shortest)
if new_path:
if (not shortest) or (len(new_path) < len(shortest)):
shortest = new_path
return shortest
# Main routine
graph = {
'A' : [('B',5),('F',10)],
'B' : [('A',5),('E',2),('C',4)],
'C' : [('B',4),('D',11)],
'D' : [('C',11),('E',7)],
'E' : [('B',2),('D',7),('F',1)],
'F' : [('A',10),('E',1)]
}
print shortest_path_edge_num(graph,'A','C')
>>> python graph.py
['A', 'B', 'C']
>>> # But when changing to path.extend([start])
>>> python graph.py
['A', 'B', 'E', 'D', 'C', 'F']
编辑
使用+ 会创建list 的新实例,因此在我每次向path 添加新元素时,以某种方式依赖它的所有其他变量都不会改变。现在的问题应该是我应该如何消除这种依赖?
【问题讨论】:
-
你的意思是,你使用了 path.extend([start])?因为 extend() 仅适用于 2 个列表。还是您使用 path.append(start) ?
-
我拼错了
.extend()。刚刚更正了。
标签: python graph shortest-path