Python 使用嵌套字典存储用户定义的图形

Python 使用嵌套字典存储用户定义的图形,python,dictionary,Python,Dictionary,我试图让用户手动输入图形,而不是在代码中使用“预先存在”的图形,以用于我的Dijkstra算法 我已经这样做了,但希望得到一些关于其实施和用户友好性的反馈。此外,是否有更有效的方法将图形输入嵌套字典?如果是,怎么办 关于代码的要点 数据必须使用嵌套字典存储 循环将为零,例如b-b为0不留空,但这仅在用户图中存在循环时发生,否则其将被忽略 理想情况下,我不想在自己编写代码之前使用现有库中的任何内容,以便更好地理解正在发生的事情 非常感谢。 编辑:不再需要重复要求 {'A': {'C': 1,

我试图让用户手动输入图形,而不是在代码中使用“预先存在”的图形,以用于我的Dijkstra算法

我已经这样做了,但希望得到一些关于其实施和用户友好性的反馈。此外,是否有更有效的方法将图形输入嵌套字典?如果是,怎么办

关于代码的要点


  • 数据必须使用嵌套字典存储
  • 循环将为零,例如b-b为0不留空,但这仅在用户图中存在循环时发生,否则其将被忽略
  • 理想情况下,我不想在自己编写代码之前使用现有库中的任何内容,以便更好地理解正在发生的事情
非常感谢。 编辑:不再需要重复要求

{'A': {'C': 1, 'B': 5}, 'D': {}, 'B': {'D': 2}, 'C': {'D': 9}}
^节点的所需输出也是当前输出

nodes = {}


def add_node():
    entered_graph = False
    while not entered_graph:
        source_node = input("Enter a source node: ")
        num_neighbours = int(input("Enter how many neighbours this node has"
                                   "including previously entered nodes: "))
        nodes[source_node] = {}
        for neighbour in range(num_neighbours):
            neighbour = input("Enter neighbor node: ")
            distance = int(input("Enter distance from source node to this neighbor node: "))
            nodes[source_node][neighbour] = distance
        end_loop = input("Enter y to finish graph entry: ")
        end_loop = end_loop.lower()
        if end_loop == "y":
            entered_graph = True

add_node()
print(nodes)

您确实只希望用户输入每个边缘一次,然后您可以只存储两次

edges = {}
while True:
    edge = input('Enter an edge as Node names separated by a space followed by a number ("exit" to exit): ')
    if edge == 'exit':
        break
    node1, node2, weight = edge.split()
    weight = float(weight)
    if node1 not in edges:
        edges[node1] = {}
    if node2 not in edges:
        edges[node2] = {}
    edges[node1][node2] = weight
    edges[node2][node1] = weight

用户输入每个边缘一次,作为
“AB 3.5”

您确实只希望用户输入每个边缘一次,然后您可以将其存储两次

edges = {}
while True:
    edge = input('Enter an edge as Node names separated by a space followed by a number ("exit" to exit): ')
    if edge == 'exit':
        break
    node1, node2, weight = edge.split()
    weight = float(weight)
    if node1 not in edges:
        edges[node1] = {}
    if node2 not in edges:
        edges[node2] = {}
    edges[node1][node2] = weight
    edges[node2][node1] = weight
用户输入每条边一次,因为
“AB3.5”

在不同的图形表示方式上有一个非常好的页面

对于无向图(a=>b和b=>a),我个人会考虑使用边列表。它可以进行排序以提高查找效率,并且比其他方法(如邻接表)更节省内存。

在表示图形的不同方式上有一个非常好的页面


对于无向图(a=>b和b=>a),我个人会考虑使用边列表。它可以进行排序以提高查找效率,并且比邻接表等其他方法更节省内存

“必须使用嵌套字典存储数据”为什么?我会创建一个以元组为键的字典
(从\u location\u id到\u location\u id)
。特别是如果您说这是一个对称图,例如-->b==b-->a。然后,您只需要存储这些对中的一个,并同时测试(a,b)或(b,a)。这对于内存方面的大问题来说非常重要。以单个位置作为键的嵌套字典将导致不必要的大规模复制。事实上,我在算法中已经纠正了这一点,因此现在不需要将每个弧添加两次。“数据必须使用嵌套字典存储”为什么?我会创建一个以元组为键的字典
(从\u location\u id到\u location\u id)
。特别是如果您说这是一个对称图,例如-->b==b-->a。然后,您只需要存储这些对中的一个,并同时测试(a,b)或(b,a)。这对于内存方面的大问题来说非常重要。使用单个位置作为键的嵌套字典将导致不必要的大量重复。事实上,我在算法中已经纠正了这一点,因此现在不需要将每个弧添加两次。