python - Python 中无法散列的查找表

标签 python hash lookup lookup-tables

我需要创建一个从我自己的自定义类(从 dict 派生)的对象到另一个自定义类的对象的映射。在我看来,有两种方法可以做到这一点:

  1. 我可以使对象可哈希。我不确定我会怎么做。我知道我可以实现 __hash__() 但我不确定如何实际计算哈希值(它应该是一个整数)。

  2. 由于我的对象可以进行比较,所以我可以创建一个列表 [(myobj, myotherobj)],然后执行查找以查找元组中的第一项与查找键相同的元组。实现它是微不足道的(对象的数量很少),但如果标准库中已经存在类似的东西,我想避免重新发明轮子。

在我看来,想要查找 unhashables 是一个常见的问题,所以我假设有人已经解决了这个问题。关于如何为类似 dict 的对象实现 __hash()__ 的任何建议,或者是否有其他一些标准方法来制作不可散列的查找表?

最佳答案

以可变对象作为键的映射通常很困难。那真的是你想要的吗?如果您认为您的对象是不可变的(在 Python 中没有办法真正强制执行不可变性),或者您知道它们在用作映射中的键时不会被更改,您可以为它们实现自己的哈希函数几种方式。例如,如果您的对象只有可散列的数据成员,您可以返回所有数据成员的元组散列作为对象散列。

如果您的对象是类似字典的,您可以使用 frozenset 的哈希值所有键值对。

def __hash__(self):
    return hash(frozenset(self.iteritems()))

这仅在所有值都是可哈希的情况下才有效。为了保存哈希值的重新计算(这将在每次查找时完成),您可以缓存哈希值并在设置了一些脏标志时重新计算它。

关于python - Python 中无法散列的查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4462119/

相关文章:

python - 无法在 Windows 7 上安装 lxml

Ruby:从哈希 A 到哈希 B 的最快路径

c# - .NET 的 HMAC 和 HMAC KeyedHashAlgorithm 有什么区别?

带有 $lookup 的 MongoDB 聚合仅包括(或投影)一些要从查询返回的字段

python - 如何使用python将其中包含unicode的字符串转换为unicode

python - Oct2Py 只返回第一个输出参数

python - django-celery redis 内存错误

python - 为什么 md5 在字符串上的散列比在 python 中的 numpy 数组上快得多?

c++ - 字符串数组到 C++ 函数

MongoDB Lookup 仅当没有数据时返回空数组