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

时间:2016-10-18 15:39:52

标签: python dictionary

我试图让用户手动输入图表,而不是在代码中使用'pre-existing',以便在我的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)

3 个答案:

答案 0 :(得分:0)

你真的只希望用户输入一次,然后你可以存储两次。

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

用户输入每个边缘一次为"A B 3.5"

答案 1 :(得分:0)

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

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

)更具内存效率

答案 2 :(得分:0)

您的源代码可能更加模块化,因为“add_node”应该只添加一个节点。我认为立即在一行中输入所有邻居的费用会更加用户友好,所以使用你坚持的数据结构:

Items.aggregate([
  {
    $group: {
      _id: '$_id',
      totalCount: {$sum: 1},
      finished: { $cond : [ {$eg: ['status', 'finished']}, $status, null] }
    }
  },
  { $unwind: '$finished'},
  ...

defaultdict保存您的检查,我认为输入这种方式比邻居更容易,而不是邻居。您甚至可以将此[源邻居成本邻居成本...] - [来源...] - ...用于一行输入。

如果你坚持不用这个类,那么模块化可以更容易地将代码添加到“图形”或“节点”中。