2017-03-18 36 views
1

在NetworkX(python)中将列表中的边添加到图中会改变边的顺序,这在绘制图时会对我造成问题。 作为例子:如何停止从列表中添加边缘时更改边缘顺序的Networkx?

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已按字母顺序排列的边缘,但我只是希望他们能在同作为最边缘的顺序。我怎么能做到这一点?

+0

我认为你的问题可能与以下问题有关:http://stackoverflow.com/questions/17258894/is-the-networkx-multidigraph-edges-method-order-preserving –

+0

它确实涉及到那个问题,谢谢。我发现不可能做我想做的事,所以我试图找到一种方法来编码。 –

回答

0

您的问题的答案有点混乱,因为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)))]) 
+0

非常感谢您的解决方案,它的工作原理! –

0

如果使用遍历算法就可以得到他们的路径进行了走访顺序边缘

```

路径= nx.all_simple_paths(G,源= 0,目标= 3) 在地图路径(nx.utils.pairwise,路径): ... (0,1),(1,3)] [(0,1),(1,2),(2,3)] [(0,2),( 2,1),(1,3)] [(0,2),(2,3)] [(0,3)] ```