【问题标题】:Python NetworkX edge lists out of rangePython NetworkX 边缘列表超出范围
【发布时间】:2016-09-27 17:12:19
【问题描述】:

我目前正在 Python2 中使用 NetworkX,只是在这里遇到了一个奇怪的情况。我想发现图中的每个节点都连接了哪些节点,所以我写了这个 for 循环。 (我知道每个节点只连接到其他两个节点,但我需要确切的标签)

    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] 显然没有超出范围。

任何想法我该如何解决? 我在这里错过了一些非常基本的东西吗?

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

非常感谢您。

【问题讨论】:

  • G.predecessors(i) 将给出所有边指向i 的节点。

标签: python networking graph networkx


【解决方案1】:

错误提示b是空列表,[]

In [143]: b = []

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

如果有一个节点 iPedigNetwork.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) &lt; 2: continue 的好处是它可以节省 你一级缩进。

【讨论】:

  • 就是这样,有些节点没有边。在这种情况下,我是否应该在尝试获取子集之前测试 b 是否为空?
猜你喜欢
  • 2020-04-04
  • 2015-03-03
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多