如何阻止Networkx在列表中添加边缘时更改边缘的顺序?

时间:2017-03-18 13:57:00

标签: python networkx

将列表中的边添加到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的顺序相同。我怎么能做到这一点?

2 个答案:

答案 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)]       ```