Как перечислить конкретный узел / край в networkx?

предположим, один ниже древовидной структуры в 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 и как перечислить" сиротский " край, не принадлежит корневому краю n, здесь n4-n41,
  4. как перечислить узел с более чем 2 "подузлами", здесь n, N1
  5. как общаться с если N131, n221 имеют ребро, существующее в обход узлов, произойдет ли цикл бесконечности?

спасибо.

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 имеет алгоритмы обхода, которые устойчивы к этому.