Python 查找两个节点之间的节点

Python 查找两个节点之间的节点,python,Python,我用python编写了dijkstras算法,并为输入G获得以下输出: G={'A': {('B', 1.0), ('C', 5.0)}, 'B': {('D', 2.0), ('E', 4.0), ('A', 1.0)}, 'C': {('A', 5.0), ('E', 3.0), ('D', 2.0)}, 'D': {('E', 1.0), ('C', 2.0), ('B', 2.0)}, 'E': {('D', 1.0), ('B', 4.0), ('C', 3.0

我用python编写了dijkstras算法,并为输入G获得以下输出:

G={'A': {('B', 1.0), ('C', 5.0)},
   'B': {('D', 2.0), ('E', 4.0), ('A', 1.0)},
   'C': {('A', 5.0), ('E', 3.0), ('D', 2.0)},
   'D': {('E', 1.0), ('C', 2.0), ('B', 2.0)},
   'E': {('D', 1.0), ('B', 4.0), ('C', 3.0)}}
i、 e A和B之间的距离为1.0,A和C之间的距离为5.0,依此类推。
最短路径(G,“A”)
给出了:

Output: {'E': 4.0, 'D': 3.0, 'A': 0, 'C': 5.0, 'B': 1.0}
现在我应该使用这个输出来查找两个节点之间的所有节点,例如:
shortestPathnew(G,“A”,“C”)

在本例中,A和C之间的最短路径是5.0,它经过A->B->D->C。因此,输出应该是(5.0,[A,B,D,C]),使用basic for循环,而不使用.iterations、.keys、yield、sort等内置函数。我被困在这一部分,任何帮助都会有帮助

我尝试在线使用示例代码,但无法根据我的要求修改它:

def shortestPathnew(G,start,end):
    """
    Find a single shortest path from the given start node
    to the given end node.  The output is a list of the node in order along the shortest path."""

    final_distances,predecessors = ShortestPath(graph,start)
    path = []
    while 1:
        path.append(end)
        if end == start: break
        end = predecessors[end]
    path.reverse()
    return path

我必须在不使用.append、.reverse的情况下实现它。根据示例代码,我可以看出,您的
最短路径
方法与示例代码使用的方法返回的结果不一样。我猜它会返回类似于:

({'E': 4.0, 'D': 3.0, 'A': 0, 'C': 5.0, 'B': 1.0}, {'B': 'A', 'D': 'B', 'C': 'A', 'E':'D', 'A': None})
所以它不仅有最终的距离,它还包括每个节点和它前面的节点(我不知道它是否包括起始节点)

如果您可以在
shortestPath
方法中生成,那么将示例代码更改为仅对循环使用基本
,应该不会太难。这里有一种可能性:

final_distances,predecessors = ShortestPath(graph,start)
path = end
while end != start:
    end = predecessors[end]
    path = '%s->%s' % (end, path)
return path
与将结果存储在列表中并将每个新节点追加到该列表的末尾不同,创建一个字符串是很容易的,每次都要在该字符串前面加上前缀。如果您需要返回列表,则可以对列表执行类似操作:

final_distances,predecessors = ShortestPath(graph,start)
path = [end]
while end != start:
    end = predecessors[end]
    path = [end] + path
return path

在这里,我将路径初始化为一个只包含
end
的列表,在循环的每个步骤中,它都会找到当前节点的前置节点,并将其前置到路径中。

能否显示当前的代码?否则我们无法改进itI,因为我已经编辑并更新了代码事实上,A->C已经是5,所以Dijkstra的算法不会更新距离。尝试使用A->C为6。您必须能够处理有向图,还是它们都是无向图?它应该处理有向图。在字符串中使用%s表示您将在字符串中插入变量值。这基本上相当于
end+'->'+path
。谢谢。是否有可能用一个简单的循环来存储列表中的内容来替换“path='%s->%s'(end,path)”。@Rachel添加了如何使用列表。