例如,考虑到:
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?树文档中给出的示例中的键行
print(list(nx.bfs_edges(G,0))) 相反,使用bfs_edge (例如,通过print(list(nx.algorithms.bfs_tree(G, 0).edges())) )似乎会产生与示例代码返回的列表相同的结果,但显然要复杂得多。我能否以一种更简单的方式使用bfs_tree()来按BFS顺序获得有向图的_nodes_列表?
当然,我可以迭代从bfs_tree或bfs_edges返回的列表,并且只使用第二个元素。但难道没有更简单的方法吗?
发布于 2015-03-16 17:29:55
为什么不将边缘元组的列表(每个两个节点)平平,然后取节点的set以确保唯一性?
list(set(sum(list(nx.algorithms.bfs_tree(G, 0).edges()), ())))在假设的解决方案中,您将忽略0节点,并且它不会包含在输出中。
或者,您可以使用bfs_successors()方法获取节点块(传入0节点)并获取values。
[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发布于 2021-11-25 11:45:08
在Networkx 2.6.2中,这实际上是有效的:
[0] + [successor for successors in dict(nx.bfs_successors(G, 0)).values() for successor in successors]编辑:我最初的建议:
[0] + sum(dict(nx.bfs_successors(G, 0)).values(), [])sum(l ,[])的成语使列表变平,但是二次型的。关于如何从列表中生成一个统一的列表的讨论
https://stackoverflow.com/questions/29082681
复制相似问题