¿Cómo listar un nodo / borde específico en networkx?

Supongamos que uno debajo de la estructura en forma de networkx en el gráfico networkx :

 n-----n1----n11 | |----n12 | |----n13 | |----n131 |----n2 | | |-----n21 X | |-----n22 | | |----n221 |----n3 n4------n41 n5 
  1. Cómo listar todos los nodos con “subnodo” y su profundidad, aquí: n, n1, n13, n2, n22, n4
  2. Cómo listar todos los nodos sin “subnodo”, aquí: n11, n12, n21, n41, n5
  3. Cómo listar el nodo huérfano, aquí: n5 y cómo listar el borde “huérfano”, no pertenece al borde raíz n, aquí n4-n41,
  4. Cómo listar un nodo con más de 2 “subnodos”, aquí n, n1
  5. ¿Cómo tratar si n131, n221 tiene una ventaja en los nodos transversales, ocurrirá el bucle infinito?

Gracias.

Construcción de gráfico:

 >>> 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. Usando la función out_degree para encontrar todos los nodos con hijos:

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

    Tenga en cuenta que n131 y n221 también aparecen aquí ya que ambos tienen una ventaja entre sí. Podrías filtrarlos si quieres.

  2. Todos los nodos sin hijos:

     >>> [k for k,v in G.out_degree().iteritems() if v == 0] ['n12', 'n11', 'n3', 'n41', 'n21', 'n5'] 
  3. Todos los nodos huérfanos, es decir, nodos con grado 0:

     >>> [k for k,v in G.degree().iteritems() if v == 0] ['n5'] 

    Para obtener todos los “bordes” huérfanos, puede obtener la lista de componentes del gráfico, filtrar los que no contienen n y luego mantener solo los que tienen bordes:

     >>> [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. Nodos con más de 2 niños:

     >>> [k for k,v in G.out_degree().iteritems() if v > 2] ['n', 'n1'] 
  5. Si atraviesas el árbol, no obtendrás un bucle infinito. NetworkX tiene algoritmos transversales que son robustos a esto.