将列表中的边添加到NetworkX(python)中的图形会改变边的顺序,这会在绘制图形时给我带来问题。 例如:
import networkx as nx
airports = ['A','B','C']
edgelst = [['C','B'],['A','B'],['A','C']]
G = nx.Graph()
G.add_nodes_from(airports)
G.add_edges_from(edgelst)
如果我检查网络中的现有边缘,则结果如下:
>>> G.edges()
[('A', 'C'), ('A', 'B'), ('C', 'B')]
NetworkX按字母顺序对边缘进行了排序,但我只是希望它们与edgelst的顺序相同。我怎么能做到这一点?
答案 0 :(得分:1)
你的问题的答案有点乱,因为NetworkX Graph
类没有保留边缘中节点的顺序。但是,可以通过对每个边进行排序以保证节点顺序来避免这种情况。 G.edges()
也可以通过自定义键进行排序,该键检索每条边出现在边列表中的索引。
import networkx as nx
edgelist = [['C','B'],['A','B'],['A','C']]
首先,对每个边缘中的节点进行排序,并创建一个字典,将每个边缘映射到边缘列表中的索引:
edgelist = [sorted(edge) for edge in edgelist]
mapping = {tuple(edge): index for (edge, index) in zip(edgelist, range(len(edgelist)))}
然后根据边缘列表中的索引边缘对图形边缘的顺序进行排序:
G = nx.Graph()
G.add_edges_from(edgelist)
sorted(G.edges(), key=lambda edge: mapping[tuple(sorted(list(edge)))])
答案 1 :(得分:0)
如果使用遍历算法,则可以按照路径
中访问的顺序获得边缘```
paths = nx.all_simple_paths(G,source = 0,target = 3) for map中的路径(nx.utils.pairwise,paths): ...打印(列表(路径)) [(0,1),(1,2),(2,3)] [(0,1),(1,3)] [(0,2),(2,1),(1,3)] [(0,2),(2,3)] [(0,3)] ```