2017-04-24 51 views
0

我想从给定的图形创建具有互斥边缘的另一个图形。Python不是用于搜索列表不工作

我从原始图中随机抽取节点并检查它是否已经存在于原始图中。 not in命令不按预期工作。

我的代码如下。

import networkx as nx 
import numpy as np 
import random 
G=nx.karate_club_graph() 
K=nx.Graph() 
sample_len=len(G.edges()) 
while(len(K.edges())<sample_len): 
    n1=random.choice(G.nodes()) 
    n2=random.choice(G.nodes()) 
    e=(n1,n2) 
    if(e not in G.edges()): 
     K.add_edge(*e) 
i=0 
for x in G.edges(): 
    if(x in K.edges()): 
     i+=1 
print i 

每次运行此代码时,i的值在5-10之间。

+0

您期望的结果是什么? –

+0

我正在检查两个图形之间的公共边。答案应该是零。 –

+0

如果你给我一个例子G = nx.karate_club_graph() K = nx.Graph()我会尽力为你取得它,我不认为这很困难,但是很长一段时间我没有使用numpy库,只是阅读代码,我不能帮助对不起! –

回答

1

使用Graph.has_edge()

import networkx as nx 
import numpy as np 
import random 
G=nx.karate_club_graph() 
K=nx.Graph() 
sample_len=len(G.edges()) 
while(len(K.edges())<sample_len): 
    n1=random.choice(G.nodes()) 
    n2=random.choice(G.nodes()) 
    e=(n1,n2) 
    if(not G.has_edge(*e)): 
     K.add_edge(*e) 
i=0 
for x in G.edges(): 
    if(K.has_edge(*x)): 
     i+=1 
print(i) 

问题可能是因为networkx存储的边缘与预期不同。对于无向图,(n1, n2)(n2, n1)将有效。因此,以下检查也可以解决您的问题,但显然比使用的更为详细:has_edge()

if((n1, n2) not in G.edges() and (n2, n1) not in G.edges()): 
    K.add_edge(n1, n2) 
+0

G.has_edge()正在工作。谢谢。但是,无法理解“不在”中有什么问题。 –

+0

查看我的描述。我相信networkx可能会以不同方式存储边缘。例如。 'G'包含一个边缘'(1,2)'。然后你检查是否有边('2,1)'存在。它不,你把它添加到'K'。稍后在图K中搜索边('1,2)'。可能'K'将边缘'​​(2,1)'存储为'(1,2)',因此可以找到它。这一切都假设这些图是无向的。 – Flurin

0

如果你愿意,你可以这样做差价:

print (list(set(G.edges()) - set(K.edges()))) 

,如果你想只是一个数字加上LEN

print (len(list(set(G.edges()) - set(K.edges())))) 

请让我知道这是否这就是你正在尝试档案;)