Networkx节点删除/删除回调

时间:2015-03-30 10:19:22

标签: python python-2.7 networkx python-2.x

给定有向网络x图。我希望有一个函数,说" abc()",调用从图中删除的每个节点。我浏览了networkx文档,但没有找到任何此类回调功能。

我考虑过:

  1. abc()的调用添加到与节点关联的对象的__del__()(解构函数)方法。然而,除了使用__del__()的缺陷(参见例如here)之外,如果节点对象的任何链接存在于内存中的某处,这将无效。
  2. networkx.DiGraph()类进行子类化并重写remove_node()方法。缺点:这需要覆盖删除节点的所有方法,例如: remove_nodes_from(还有吗?)
  3. 由于networkx图表的实现是基于字典的,因此它可能是一种解决方案,以某种方式“钩”'这本词典的del功能。尽管如此,干扰网络x似乎是不合适的。
  4. 实现每次删除networkx节点时调用的回调函数的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您只需要子类化两个方法。这是一个例子 来自networkx import DiGraph

class RemoveNodeDiGraph(DiGraph):
    def remove_node(self, n):
        DiGraph.remove_node(self, n)
        print("Remove node: %s"%n)

    def remove_nodes_from(self, nodes):
        for n in nodes:
            self.remove_node(n)

if __name__=='__main__':
    G = RemoveNodeDiGraph()
    G.add_node('foo')
    G.add_nodes_from('bar',weight=8)
    G.remove_node('b')
    G.remove_nodes_from('ar')

这不如DiGraph类中的原始方法(特别是remove_nodes_from())快,但除非你有非常大的图形,否则它不会很重要。如果您需要更好的性能,可以直接从这些方法复制代码,而不是调用超类。