Если у вас есть ребра и узлы в виде списка, то построить график в networkx просто. Учитывая, что ваша проблема возникает при построении графического объекта, возможно, лучшая диагностика - пройти построение графа в networkx шаг за шагом:
import networkx as NX
import string
import random
G = NX.Graph() # initialize the graph
# just generate some synthetic data for the nodes and edges:
my_nodes = [ ch for ch in string.ascii_uppercase ]
my_nodes2 = list(my_nodes)
random.shuffle(my_nodes2)
my_edges = [ t for t in zip(my_nodes, my_nodes2) if not t[0]==t[1] ]
# now add the edges and nodes to the networkx graph object:
G.add_nodes_from(my_nodes)
G.add_edges_from(my_edges)
# look at the graph's properties:
In [87]: len(G.nodes())
Out[87]: 26
In [88]: len(G.edges())
Out[88]: 25
In [89]: G.edges()[:5]
Out[89]: [('A', 'O'), ('A', 'W'), ('C', 'U'), ('C', 'F'), ('B', 'L')]
# likewise, shortest path calculation is straightforward
In [86]: NX.shortest_path(G, source='A', target='D', weighted=False)
Out[86]: ['A', 'W', 'R', 'D']
По моему опыту, Networkx имеет чрезвычайно разрешающий интерфейс, в частности, он будет принимать широкий спектр типов объектов в качестве узлов и ребер. Узлом может быть любой хешируемый объект, кроме None.
Единственное, о чем я могу подумать, это может вызвать ошибку, которую вы представили в своем вопросе, - это то, что, возможно, после того, как вы создали график, вы напрямую манипулировали объектом графа ( dict, * G *), чего не следует делать - существует множество методов доступа.