2016-05-30 102 views
1

我目前在Python2中使用NetworkX,并且在这里遇到了一个奇怪的情况。我想要发现哪些节点连接到图形中的每个节点,因此我编写了这个循环。 (我知道每个节点仅连接到两个其它节点,但我需要的确切标签)Python NetworkX边缘列表超出范围

for i in sorted(graph.nodes(), key=int): 
     b = [int(edge_tuple[0]) for edge_tuple in PedigNetwork.in_edges(i)] 
     print i, b 

因此,对于每一个元素ib是长度为2的列表,包含在两个节点的识别连接到节点i

但是,当我尝试访问该列表的第一个(b[0])元素时,它将返回一个错误,指出该索引超出范围。

print i, b[0] 
    IndexError: list index out of range 

但是,如果列表中有两个元素,[0]显然没有超出范围。

任何意识如何解决它? 我在这里错过了一些非常基本的东西吗?

我想单独访问第一个和第二个元素,然后将它们存储到列表中。

非常感谢您提前。

+0

'G.predecessors(i)'将给所有有边指向'i'的节点。 – Joel

回答

2

的错误意味着b是空列表,[]

In [143]: b = [] 

In [147]: b[0] 
IndexError: list index out of range 

,如果有一个节点i为其PedigNetwork.in_edges(i) 返回一个空列表可能发生。为了验证这一理论,你可以运行

for i in sorted(graph.nodes(), key=int): 
    b = [int(edge_tuple[0]) for edge_tuple in PedigNetwork.in_edges(i)] 
    if not b: 
     print('Empty list: {}, {}'.format(i, b)) 
     break 

如果打印Empty list: ...那么你有你的罪魁祸首。


如果你想跳过节点,其中PedigNetwork.in_edges(i)是空的,你可以使用

for i in sorted(graph.nodes(), key=int): 
    b = [int(edge_tuple[0]) for edge_tuple in PedigNetwork.in_edges(i)] 
    if len(b) < 2: continue 
    print(i, b[0], b[1]) 

for i in sorted(graph.nodes(), key=int): 
    b = [int(edge_tuple[0]) for edge_tuple in PedigNetwork.in_edges(i)] 
    if len(b) >= 2: 
     print(i, b[0], b[1]) 

选择第一种方法的优点,if len(b) < 2: continue是可以节省 你一个缩进级别。

+0

就是这样,有没有边缘的节点。在那种情况下,我应该在试图获取子集之前测试b是否为空? – BrnCPrz