我正在尝试消除包含数千个自定义对象的数组的重复项。
为此,我正在为这些对象实现__hash__
和__cmp__
函数。
将这些函数委托给其中一个对象的字段(保证唯一字符串)是否安全?
即
class A:
def __init__(self, key, etc...):
self.key = key
...
def __hash__(self):
return self.key.__hash__()
def __cmp__(self, other):
return cmp(self.key, other.key)
# then somewhere in code with arr being array of A
unique = sorted(set(arr))
任何提示都非常感谢!
答案 0 :(得分:2)
Yes。 __hash__
的唯一要求是它是唯一的。事实上,这是一种非常优雅和Pythonic解决问题的方法!
编辑:有人向我指出__hash__
甚至不需要是唯一的!相反,一个人只需要相同的对象来拥有相同的哈希值。不相等的也具有相同的哈希值;事实上,一切都可以哈希到0
,这在(技术上)很好。
答案 1 :(得分:2)
Eschew __cmp__
。 Python3 no longer supports这种特殊方法,建议改用__lt__
。
def __lt__(self,other):
return self.key < self.other
答案 2 :(得分:2)
两个不相等的对象可能具有相同的哈希值,但是两个相等的对象可能没有不同的哈希值。法律:
a == b --> hash(a) == hash(b)
描述了这一点。否则你不能将它们用作字典键或将它们设置为集合。好吧,也许你可以添加它们,但是你以后无法检索它们。
因此,在委派__hash__()
时,我总是定义__eq__()
,只是为了安全起见:
def __hash__(self):
return hash(self.key)
def __eq__(self, other):
return self.key == other.key
由于您要对对象进行排序,因此还必须添加unutbus __lt__()
。