Python 不带'的边的列表;networkx图形中是否不存在?

Python 不带'的边的列表;networkx图形中是否不存在?,python,graph,networkx,Python,Graph,Networkx,我有一个networkx图。使用G.edges()我可以得到所有边的列表。但是,有没有办法获得所有其他不存在的边的列表?如果有3个节点:a,b,c,我们假设a和b是连接的,那么我想得到一个不存在的边的列表,就像这样:(a,c),(c,b)。有一种简单的pythonic方法可以做到这一点吗?请注意,现在networkx有了一个非\u边(还有一个非邻居)功能 您可以使用itertools.compositions遍历所有可能的边,并使用G.has\u edge检查它是否不是G中的边: import

我有一个
networkx
图。使用
G.edges()
我可以得到所有边的列表。但是,有没有办法获得所有其他不存在的边的列表?如果有3个节点:a,b,c,我们假设a和b是连接的,那么我想得到一个不存在的边的列表,就像这样:
(a,c),(c,b)
。有一种简单的pythonic方法可以做到这一点吗?

请注意,现在networkx有了一个
非\u边
(还有一个
非邻居
)功能


您可以使用
itertools.compositions
遍历所有可能的边,并使用
G.has\u edge
检查它是否不是G中的边:

import networkx as nx
import itertools as IT
G = nx.MultiGraph()
G.add_edges_from([('A', 'B'), ('B', 'C')])

missing = [pair for pair in IT.combinations(G.nodes(), 2)
           if not G.has_edge(*pair)]
print(missing)
屈服

[('A', 'C')]

@联合国大学的答案可能是最有效的方法。您还可以生成补码图并发出边

In [1]: import networkx as nx                                                           

In [2]: G = nx.Graph([('A', 'B'), ('B', 'C')])                                          

In [3]: print(nx.complement(G).edges()) 
[('A', 'C')]

实际上,networkx 1.9中有一个新函数正是为此而调用的:

import networkx as nx
G = nx.MultiGraph()
G.add_edges_from([('A', 'B'), ('B', 'C')])
list(nx.non_edges(G))

Out[3]:
[('A', 'C')]

我在这里将非_边放入一个
list()
命令来具体化输出,如
nx。非_边是一个生成器。拥有一个生成器在处理大型图形时非常有用。

难道不是
G.有_edge()
线性搜索吗?我想这会很慢!!否,
G.has_edges
尝试在
G.adj
adjacedict中查找边。因此查找为O(1)。检查以西结的答案,以获得“新”内置网络Xfunction@Joel:谢谢你的提醒。