首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用networkx bfs_tree按BFS顺序获得有向图的节点列表

使用networkx bfs_tree按BFS顺序获得有向图的节点列表
EN

Stack Overflow用户
提问于 2015-03-16 17:00:24
回答 2查看 4.3K关注 0票数 2

例如,考虑到:

代码语言:javascript
复制
G = nx.DiGraph()
G.add_path([0, 1])
G.add_path([0, 2])
G.add_path([0, 3])

G.add_path([1, 11])
G.add_path([1, 12])

G.add_path([2, 21])
G.add_path([2, 22])

G.add_path([3, 31])
G.add_path([3, 32])

我想要这个:0, 1, 2, 3, 11, 12, 21, 22, 31, 32

为什么bfs_tree的networkx文档在其示例中实际上使用了bfs_edges?而不是bfs_tree树文档中给出的示例中的键行

代码语言:javascript
复制
print(list(nx.bfs_edges(G,0))) 

相反,使用bfs_edge (例如,通过print(list(nx.algorithms.bfs_tree(G, 0).edges())) )似乎会产生与示例代码返回的列表相同的结果,但显然要复杂得多。我能否以一种更简单的方式使用bfs_tree()来按BFS顺序获得有向图的_nodes_列表?

当然,我可以迭代从bfs_treebfs_edges返回的列表,并且只使用第二个元素。但难道没有更简单的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 17:29:55

为什么不将边缘元组的列表(每个两个节点)平平,然后取节点的set以确保唯一性?

代码语言:javascript
复制
list(set(sum(list(nx.algorithms.bfs_tree(G, 0).edges()), ())))

在假设的解决方案中,您将忽略0节点,并且它不会包含在输出中。

或者,您可以使用bfs_successors()方法获取节点块(传入0节点)并获取values

代码语言:javascript
复制
[0].extend(nx.algorithms.bfs_successors(G, 0).values())
# Get your first, node, and extend with a list of all successor nodes in BFS order
票数 1
EN

Stack Overflow用户

发布于 2021-11-25 11:45:08

在Networkx 2.6.2中,这实际上是有效的:

代码语言:javascript
复制
[0] + [successor for successors in dict(nx.bfs_successors(G, 0)).values() for successor in successors]

编辑:我最初的建议:

代码语言:javascript
复制
[0] + sum(dict(nx.bfs_successors(G, 0)).values(), [])

sum(l ,[])的成语使列表变平,但是二次型的。关于如何从列表中生成一个统一的列表的讨论

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29082681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档