Networkx节点删除/移除回调
Networkx node deletion / removal callback
给定一个有向 networkx 图。我想要一个函数,比如“abc()
”,为从图中删除的每个节点调用。我浏览了 networkx 文档,但没有找到任何此类回调功能。
我考虑的是:
- 将对
abc()
的调用添加到与节点关联的对象的 __del__()
(解构函数)方法。然而,除了使用 __del__()
的陷阱(参见 here)之外,如果内存中某处存在指向节点对象的任何链接,这将不起作用。
- Subclassing
networkx.DiGraph()
class 并覆盖 remove_node() 方法。缺点:这将需要重写所有删除节点的方法,例如remove_nodes_from
(还有吗?)
- 由于 networkx 图的实现是基于字典的,因此它可以以某种方式解决 'hook' 该字典的
del
功能。不过,对 networkx 进行如此深入的干预似乎是不合适的。
实现每次删除 networkx 节点时调用的回调函数的最简单方法是什么?
在这种情况下你只需要subclass两个方法。这是一个例子
从 networkx 导入有向图
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 class(尤其是 remove_nodes_from())中的原始方法那么快,但除非您有非常大的图,否则它可能不会很重要。如果您需要更好的性能,您可以直接从这些方法中复制代码,而不是调用 superclass.
给定一个有向 networkx 图。我想要一个函数,比如“abc()
”,为从图中删除的每个节点调用。我浏览了 networkx 文档,但没有找到任何此类回调功能。
我考虑的是:
- 将对
abc()
的调用添加到与节点关联的对象的__del__()
(解构函数)方法。然而,除了使用__del__()
的陷阱(参见 here)之外,如果内存中某处存在指向节点对象的任何链接,这将不起作用。 - Subclassing
networkx.DiGraph()
class 并覆盖 remove_node() 方法。缺点:这将需要重写所有删除节点的方法,例如remove_nodes_from
(还有吗?) - 由于 networkx 图的实现是基于字典的,因此它可以以某种方式解决 'hook' 该字典的
del
功能。不过,对 networkx 进行如此深入的干预似乎是不合适的。
实现每次删除 networkx 节点时调用的回调函数的最简单方法是什么?
在这种情况下你只需要subclass两个方法。这是一个例子 从 networkx 导入有向图
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 class(尤其是 remove_nodes_from())中的原始方法那么快,但除非您有非常大的图,否则它可能不会很重要。如果您需要更好的性能,您可以直接从这些方法中复制代码,而不是调用 superclass.