假设一个低于树状结构networkx
图:
n-----n1----n11
| |----n12
| |----n13
| |----n131
|----n2 |
| |-----n21 X
| |-----n22 |
| |----n221
|----n3
n4------n41
n5
- 如何列出与 “子节点” 和它的深度,这里所有的节点:N,N1,N13,N2,N22,N4
- 如何列出所有节点没有 “子节点”,在这里:N11,N12,N21,N41,N5
- 如何列出孤儿节点,在这里:N5以及如何列出“孤儿”的边缘,不属于root N个边缘,这里N4-N41,
- 如何列出超过2“的子节点”节点,这里N,N1
- 如何应对,如果N131,N221在节点遍历存在边缘,将无限循环发生?
谢谢。
图施工:
>>> import networkx as nx
>>> G = nx.DiGraph()
>>> G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')])
>>> G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')])
>>> G.add_edges_from([('n2', 'n21'), ('n2', 'n22')])
>>> G.add_edges_from([('n13', 'n131'), ('n22', 'n221')])
>>> G.add_edges_from([('n131', 'n221'), ('n221', 'n131')]
>>> G.add_node('n5')
使用out_degree功能,找到所有与儿童的节点:
>>> [k for k,v in G.out_degree().iteritems() if v > 0] ['n13', 'n', 'n131', 'n1', 'n22', 'n2', 'n221', 'n4']
需要注意的是N131和N221也出现在这里,因为它们都具有一个边缘彼此。 如果你愿意,你可以过滤这些了。
没有孩子的所有节点:
>>> [k for k,v in G.out_degree().iteritems() if v == 0] ['n12', 'n11', 'n3', 'n41', 'n21', 'n5']
所有孤儿节点,具有0度,即节点:
>>> [k for k,v in G.degree().iteritems() if v == 0] ['n5']
要获得所有孤儿“边缘”,即可获得该图的组件列表,过滤掉不包含那些n
,然后只保留有边缘的那些:
>>> [G.edges(component) for component in nx.connected_components(G.to_undirected()) if len(G.edges(component)) > 0 and 'n' not in component] [[('n4', 'n41')]]
节点有超过2个孩子:
>>> [k for k,v in G.out_degree().iteritems() if v > 2] ['n', 'n1']
如果您遍历树,你不会得到一个无限循环。 NetworkX具有遍历算法是稳健的这一点。