我需要创建一个从我自己的自定义类(从 dict 派生)的对象到另一个自定义类的对象的映射。在我看来,有两种方法可以做到这一点:
我可以使对象可哈希。我不确定我会怎么做。我知道我可以实现
__hash__()
但我不确定如何实际计算哈希值(它应该是一个整数)。由于我的对象可以进行比较,所以我可以创建一个列表 [(myobj, myotherobj)],然后执行查找以查找元组中的第一项与查找键相同的元组。实现它是微不足道的(对象的数量很少),但如果标准库中已经存在类似的东西,我想避免重新发明轮子。
在我看来,想要查找 unhashables 是一个常见的问题,所以我假设有人已经解决了这个问题。关于如何为类似 dict 的对象实现 __hash()__
的任何建议,或者是否有其他一些标准方法来制作不可散列的查找表?
最佳答案
以可变对象作为键的映射通常很困难。那真的是你想要的吗?如果您认为您的对象是不可变的(在 Python 中没有办法真正强制执行不可变性),或者您知道它们在用作映射中的键时不会被更改,您可以为它们实现自己的哈希函数几种方式。例如,如果您的对象只有可散列的数据成员,您可以返回所有数据成员的元组散列作为对象散列。
如果您的对象是类似字典的,您可以使用 frozenset 的哈希值所有键值对。
def __hash__(self):
return hash(frozenset(self.iteritems()))
这仅在所有值都是可哈希的情况下才有效。为了保存哈希值的重新计算(这将在每次查找时完成),您可以缓存哈希值并在设置了一些脏标志时重新计算它。
关于python - Python 中无法散列的查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4462119/