【发布时间】:2015-04-23 00:49:19
【问题描述】:
我有 2 个类实例,我想将它们解析为字典中的相同键:
class CustomClass():
def __hash__(self):
return 2
a = CustomClass()
b = CustomClass()
dicty = {a : 1}
这里,a 和 b 不等于 key:
>>> a in dicty
True
>>> b in dicty
False
哈希到底发生了什么;似乎 CustomClass 的第二个实例应该与散列匹配?这些哈希不匹配是怎么回事?
我刚刚发现实际的类是被散列的。那么如何为类添加自定义字典键(即当我尝试使用类作为字典的键时,应该如何存储它以便 a 和 b 匹配)?
请注意,在这种情况下,我不关心在字典中保留指向原始对象的链接,我可以使用一些不可用的键对象;重要的是他们的决心相同。
编辑:
也许需要一些关于我想解决的实际案例的建议。
我的类包含形状为(8,6) 的布尔值np.arrays。我想对这些进行哈希处理,以便每当将此对象放入字典时,都会对这些值进行比较。我根据this 的回答用它们制作了一个位数组。我注意到那里有一个__cmp__(感谢thefourtheye 表明我必须看那里)。但是,我的课程可以更新,所以我只想在实际尝试将 np.array 放入字典时对其进行散列,而不是在初始化时(因此每当我 init 时存储可散列位数组,因为 np.array 可能会被更新,这样哈希就不再是真实的表示了)。我知道每当我更新 np.array 时,我也可以更新散列值,但我宁愿只散列一次!
【问题讨论】:
-
so I'd only like to hash the np.array when I'm actually trying to put it into a dictionary- 好吧,假设你存储在字典中。但如果后者可以改变,你将如何从字典中得到它? -
我不想从字典里得到它。
-
那为什么还要把它存储在字典中呢?对我来说听起来像是XY Problem。
-
首先,我用初始散列类对象填充一个集合。之后,我动态生成了很多冗余的类对象,我想使用一个新的字典对其进行计数,只要有哈希命中,计数就会增加。在计数的情况下,我不关心类是否完全相等,我只关心那个阶段的哈希值。
-
也许我不应该尝试
myset.add(myclassobject)和测试myclassobject in mydict但我应该只做myset.add(hash(myclassobject)和hash(myclassobject) in mydict只需要进行两次计算(如果我也会在__eq__或__cmp__中散列!
标签: python python-3.x dictionary hash