Orden de nivel de desplazamiento para el gráfico en networkx

Estoy intentando convertir un DiGraph en un DiGraph n-ario y mostrar los nodos en orden de nivel o BFS. Mi árbol es similar a este, pero mucho más grande, por simplicidad usando este ejemplo:

 G = networkx.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')]) 

Árbol: tomó prestados los datos de esta pregunta :

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

Estoy usando networkx.DiGraph para este propósito y creé el gráfico con éxito. Aquí está mi código para crear un DiGraph:

 G = nx.DiGraph() roots = set() for l in raw.splitlines(): if len(l): target, prereq = regex1.split(l) deps = tuple(regex2.split(prereq)) print("Add node:") + target roots.add(target) G.add_node(target) for d in deps: if d: G.add_edge(target, d) 

Estoy leyendo todos los datos de un archivo con aproximadamente 200 líneas en el siguiente formato y tratando de obtener un árbol de dependencias. Mi gráfica es de alrededor de 100 nodos con 600 aristas.

 AAA: BBB,CCC,DDD, BBB: DDD: EEE,FFF,GGG,KKK GGG: AAA,BBB,III,LLL .... ... .. . 

Después de mirar los documentos de networkx en línea, ahora puedo lograr la salida de orden de nivel haciendo una ordenación topológica en el árbol de dependencias, con el siguiente código.

 order = nx.topological_sort(G) print "topological sort" print order 

salida:

 ['n2', 'n3', 'n1', 'n21', 'n22', 'n11', 'n13', 'n12', 'n221', 'n131'] 

El orden parece correcto, pero como necesito procesar los trabajos en un lote (lo que ahorra tiempo) y no de manera secuencial, quiero la salida en lotes de salida ordenados por nivel o utilizando BFS. Cuál es la mejor manera de lograr esto ?
ej: nivel [0: n], ej:

 0. ['n'] 1. ['n2', 'n3', 'n1',] 2. ['n21', 'n22', 'n11',] 3. ['n13', 'n12', 'n221', 'n131'] 

Podría usar la función bfs_edges () para obtener una lista de nodos en un orden de primera búsqueda.

 In [1]: import networkx In [2]: G = networkx.DiGraph() In [3]: G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')]) In [4]: G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')]) In [5]: G.add_edges_from([('n2', 'n21'), ('n2', 'n22')]) In [6]: G.add_edges_from([('n13', 'n131'), ('n22', 'n221')]) In [7]: list(networkx.bfs_edges(G,'n')) Out[7]: [('n', 'n2'), ('n', 'n3'), ('n', 'n1'), ('n2', 'n21'), ('n2', 'n22'), ('n1', 'n11'), ('n1', 'n13'), ('n1', 'n12'), ('n22', 'n221'), ('n13', 'n131')] In [8]: [t for (s,t) in networkx.bfs_edges(G,'n')] Out[8]: ['n2', 'n3', 'n1', 'n21', 'n22', 'n11', 'n13', 'n12', 'n221', 'n131'] In [9]: networkx.single_source_shortest_path_length(G,'n') Out[9]: {'n': 0, 'n1': 1, 'n11': 2, 'n12': 2, 'n13': 2, 'n131': 3, 'n2': 1, 'n21': 2, 'n22': 2, 'n221': 3, 'n3': 1}