NetworkX中,如何获取包含节点数据的DFS树?
In NetworkX, how to get the DFS tree including the node data?
在一个有向图中,节点不仅有 ID,还有数据(属性字典),我想从给定的源节点开始获取 DFS 树,包括子节点的data.
不过,我注意到 nx.dfs_tree
函数似乎 return 一棵没有任何数据的树:
In [1]: import networkx as nx
In [2]: G = nx.DiGraph()
In [3]: G.add_nodes_from([(0, {'name': 'foo'}), (1, {'name': 'bar'}), (2, {'name
...: ': 'baz'})])
In [4]: G.add_edge(0, 1)
In [5]: G.add_edge(1, 2)
In [6]: T = nx.dfs_tree(G, 1)
In [7]: T.nodes[1]
Out[7]: {}
In [8]: T.nodes[2]
Out[8]: {}
In [9]: T.nodes
Out[9]: NodeView((1, 2))
In [10]: G.nodes[1]
Out[10]: {'name': 'bar'}
从上面的例子可以看出,T.nodes[1]
是一个空字典,而G.nodes[1]
包含了原来传入的数据字典。
如何才能使 T.nodes[1]
和其他树节点包含与原始图相同的数据?
我最终使用 add_nodes_from
方法将数据从 G
复制到 T
,这会更新现有属性:
In [31]: T.add_nodes_from((i, G.nodes[i]) for i in T.nodes)
In [32]: T.nodes[1]
Out[32]: {'name': 'bar'}
任何更优雅的解决方案将不胜感激。
我建议使用 G.subgraph()
。用dfs树返回的节点从图中提取所有数据,像这样G.subgraph(nx.dfs_tree(G, 1).nodes())
这避免了单独遍历每个节点的理解列表,它会自动存储节点数据和边缘数据,而add_nodes_from()
只添加图G
的节点数据
在一个有向图中,节点不仅有 ID,还有数据(属性字典),我想从给定的源节点开始获取 DFS 树,包括子节点的data.
不过,我注意到 nx.dfs_tree
函数似乎 return 一棵没有任何数据的树:
In [1]: import networkx as nx
In [2]: G = nx.DiGraph()
In [3]: G.add_nodes_from([(0, {'name': 'foo'}), (1, {'name': 'bar'}), (2, {'name
...: ': 'baz'})])
In [4]: G.add_edge(0, 1)
In [5]: G.add_edge(1, 2)
In [6]: T = nx.dfs_tree(G, 1)
In [7]: T.nodes[1]
Out[7]: {}
In [8]: T.nodes[2]
Out[8]: {}
In [9]: T.nodes
Out[9]: NodeView((1, 2))
In [10]: G.nodes[1]
Out[10]: {'name': 'bar'}
从上面的例子可以看出,T.nodes[1]
是一个空字典,而G.nodes[1]
包含了原来传入的数据字典。
如何才能使 T.nodes[1]
和其他树节点包含与原始图相同的数据?
我最终使用 add_nodes_from
方法将数据从 G
复制到 T
,这会更新现有属性:
In [31]: T.add_nodes_from((i, G.nodes[i]) for i in T.nodes)
In [32]: T.nodes[1]
Out[32]: {'name': 'bar'}
任何更优雅的解决方案将不胜感激。
我建议使用 G.subgraph()
。用dfs树返回的节点从图中提取所有数据,像这样G.subgraph(nx.dfs_tree(G, 1).nodes())
这避免了单独遍历每个节点的理解列表,它会自动存储节点数据和边缘数据,而add_nodes_from()
只添加图G