如何列出networkx特定节点/边缘?(How to list specific node/edg

2019-07-31 02:03发布

假设一个低于树状结构networkx图:

n-----n1----n11
 |     |----n12
 |     |----n13
 |           |----n131 
 |----n2             | 
 |     |-----n21     X
 |     |-----n22     |
 |            |----n221 
 |----n3


      n4------n41
      n5
  1. 如何列出与 “子节点” 和它的深度,这里所有的节点:N,N1,N13,N2,N22,N4
  2. 如何列出所有节点没有 “子节点”,在这里:N11,N12,N21,N41,N5
  3. 如何列出孤儿节点,在这里:N5以及如何列出“孤儿”的边缘,不属于root N个边缘,这里N4-N41,
  4. 如何列出超过2“的子节点”节点,这里N,N1
  5. 如何应对,如果N131,N221在节点遍历存在边缘,将无限循环发生?

谢谢。

Answer 1:

图施工:

>>> 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')
  1. 使用out_degree功能,找到所有与儿童的节点:

     >>> [k for k,v in G.out_degree().iteritems() if v > 0] ['n13', 'n', 'n131', 'n1', 'n22', 'n2', 'n221', 'n4'] 

    需要注意的是N131和N221也出现在这里,因为它们都具有一个边缘彼此。 如果你愿意,你可以过滤这些了。

  2. 没有孩子的所有节点:

     >>> [k for k,v in G.out_degree().iteritems() if v == 0] ['n12', 'n11', 'n3', 'n41', 'n21', 'n5'] 
  3. 所有孤儿节点,具有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')]] 
  4. 节点有超过2个孩子:

     >>> [k for k,v in G.out_degree().iteritems() if v > 2] ['n', 'n1'] 
  5. 如果您遍历树,你不会得到一个无限循环。 NetworkX具有遍历算法是稳健的这一点。



文章来源: How to list specific node/edge in networkx?