如何列出networkx中的特定节点/边缘?

use*_*514 7 python traversal graph networkx

假设图中的树状结构如下networkx:

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


      n4------n41
      n5
Run Code Online (Sandbox Code Playgroud)
  1. 如何列出具有"子节点"及其深度的所有节点,这里:n,n1,n13,n2,n22,n4
  2. 如何列出没有"子节点"的所有节点,这里:n11,n12,n21,n41,n5
  3. 如何列出orphan节点,这里:n5以及如何列出"orphan"边缘,不属于root n edge,这里是n4-n41,
  4. 如何列出超过2个"子节点"的节点,这里是n,n1
  5. 如果n131,n221在节点遍历中存在边缘,如何处理,无限循环会发生吗?

谢谢.

jte*_*ace 9

图形构造:

>>> 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')
Run Code Online (Sandbox Code Playgroud)
  1. 使用out_degree函数查找包含子节点的所有节点:

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

    注意,n131和n221也出现在这里,因为它们彼此都有一个边缘.你可以根据需要过滤掉这些.

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

    >>> [k for k,v in G.out_degree().iteritems() if v == 0]
    ['n12', 'n11', 'n3', 'n41', 'n21', 'n5']
    
    Run Code Online (Sandbox Code Playgroud)
  3. 所有孤立节点,即度为0的节点:

    >>> [k for k,v in G.degree().iteritems() if v == 0]
    ['n5']
    
    Run Code Online (Sandbox Code Playgroud)

    要获取所有孤立"边缘",您可以获取图形的组件列表,过滤掉不包含的组件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')]]
    
    Run Code Online (Sandbox Code Playgroud)
  4. 超过2个孩子的节点:

    >>> [k for k,v in G.out_degree().iteritems() if v > 2]
    ['n', 'n1']
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果遍历树,则不会获得无限循环.NetworkX具有对此具有鲁棒性的遍历算法.