Python调用get_weight获取图顶点权重出现KeyError如何解决
问题原因
Python 中自定义类的实例作为字典键时,默认会以实例的内存地址作为哈希值、相等判断的依据:
- 你调用
Vertex(2)时生成的是全新的独立实例,和图中已经存在的id为2的顶点实例内存地址完全不同,因此adjacent字典会认为这是两个完全不同的键,自然找不到对应值抛出KeyError。 - for循环中遍历得到的
key本身就是adjacent字典里存储的旧实例,内存地址完全匹配,因此可以正常查询。
解决方案
方案1:直接复用图中已有的顶点实例(推荐)
不需要修改类定义,直接从图的顶点字典中获取已经存在的id为2的顶点实例来查询即可,将报错行替换为:
test.final.vert_dict[1].get_weight(test.final.vert_dict[2])
也可以调用你写好的get_vertex方法获取:
test.final.vert_dict[1].get_weight(test.final.get_vertex(2))
方案2:重写Vertex类的相等判断和哈希方法
如果你希望只要顶点id相同就视为同一个键,可以给Vertex类新增__eq__和__hash__方法:
class Vertex: def __init__(self, node): self.id = node self.adjacent = {} # 原有方法保留,新增以下两个方法 def __eq__(self, other): if not isinstance(other, Vertex): return False return self.id == other.id def __hash__(self): return hash(self.id) # 剩余原有方法不变
修改完成后你原来的test.final.vert_dict[1].get_weight(Vertex(2))写法就可以正常运行。
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

