概述
这种行为是否已在某处实施?我找不到这个方向的任何信息.
如果我必须自己实施,以下评估是否现实?
>在一个类中包装networkx.Graph.
>定义__eq__使其调用is_isomorphic.
>以某种方式定义__hash__(欢迎提出建议).
我认为我必须使这个包装的Graph不可变,because:
If a class defines mutable objects and implements an __eq__()
method,it should not implement __hash__()
,since the implementation of hashable collections requires that a key’s hash value is immutable (if the object’s hash value changes,it will be in the wrong hash bucket).
import networkx as nx class myGraph(nx.Graph): def __eq__(self,other): return nx.is_isomorphic(self,other) def __hash__(self): return hash(tuple(sorted(self.degree().values()))) if __name__ == '__main__': G1 = myGraph([(1,2)]) G2 = myGraph([(2,3)]) G3 = myGraph([(1,2),(2,3)]) print G1.__hash__(),G1.edges() print G2.__hash__(),G2.edges() print G3.__hash__(),G3.edges() print G1 == G2 print G1 == G3 graphs = {} graphs[G1] = 'G1' graphs[G2] = 'G2' graphs[G3] = 'G3' print graphs.items()
输出类似于:
3713081631935493181 [(1,2)] 3713081631935493181 [(2,3)] 2528504235175490287 [(1,3)] True False [(<__main__.myGraph object at 0xe47a90>,'G2'),(<__main__.myGraph object at 0x1643250>,'G3')] [aric@hamerkop tmp]$python gc.py 3713081631935493181 [(1,3)] True False [(<__main__.myGraph object at 0x1fefad0>,(<__main__.myGraph object at 0x27ea290>,'G3')]
总结
以上是编程之家为你收集整理的python – NetworkX Graph对象的’Isomorphic’比较,而不是默认的’address’比较全部内容,希望文章能够帮你解决python – NetworkX Graph对象的’Isomorphic’比较,而不是默认的’address’比较所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧