【问题标题】:find path and convert from dictionary to list查找路径并从字​​典转换为列表
【发布时间】:2020-06-17 04:09:36
【问题描述】:

我正在使用带有 BFS 和 DFS 的 Python 的 networkx 库。我需要获取一棵树,然后对其进行探索以获取从开始节点到结束节点的路径。

对于 BFS 部分,我使用的是 bfs_successors,它从源代码返回广度优先搜索中的后继迭代器。

对于我正在使用的 DFS 部分:dfs_successors,它会从源代码中返回深度优先搜索的继承者字典。

我需要从两种算法中获取从源到端的节点列表。每个节点是 (x, y) 并且是网格中的一个单元格。

这是我到目前为止所做的:

BFS = nx.bfs_successors(mazePRIM, start)
print(dict(BFS))

DFS = nx.dfs_successors(mazePRIM, start)
print(DFS)

我明白了:

{(0, 0): [(0, 1), (1, 0)], (1, 0): [(1, 1)], (1, 1): [(1, 2)], (1, 2): [(0, 2), (1, 3)], (0, 2): [(0, 3)]}

{(0, 0): [(0, 1), (1, 0)], (1, 0): [(1, 1)], (1, 1): [(1, 2)], (1, 2): [(0, 2), (1, 3)], (0, 2): [(0, 3)]}

但我需要这样的输出:

[(0, 0), (1, 0), (1, 1), (1, 2), (1, 3)]

这是从头到尾的节点列表。

您对如何操作有什么建议吗?你能帮帮我吗?

【问题讨论】:

  • 看起来您在这里问的问题与stackoverflow.com/questions/62412222 中的问题相同。 bfs_successorsdfs_successors 本身不会为您提供从 startend 的路径。为此,您可以使用shortest_pathall_simple_paths
  • 嗨@rkersh!是的,我做到了,但后来我发现答案并不适合我的需要。我试图更改帖子并取消它,但我不能,所以我写了一个新的(this)并得到了我需要的答案
  • 下面的答案不会为您提供您在问题中所要求的内容。相反,他们使用广度优先搜索或深度优先搜索提供从start 可以到达的每个节点。
  • 嗯,它对完成我的代码很有帮助...

标签: python dictionary networkx depth-first-search breadth-first-search


【解决方案1】:

使用列表理解并暗示将.keys() 添加到字典的末尾:

DFS = nx.bfs_successors(mazePRIM,start)
print([n for n in dict(BFS).keys()])

DFS = nx.dfs_successors(mazePRIM, start)
print([n for n in DFS.keys()])

您可以在此处阅读有关字典键的更多信息:

How to return dictionary keys as a list in Python?

【讨论】:

  • 非常感谢!您还知道如何获取字典中两个元素之间的路径吗?
  • .keys() 更改为.values()
【解决方案2】:

您可以简单地将字典键直接转换为列表:

DFS = nx.bfs_successors(mazePRIM,start)
print(list(dict(BFS).keys()))

DFS = nx.dfs_successors(mazePRIM, start)
print(list(dict(DFS).keys()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2017-04-23
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多