安排python的排序(set(<collection>))</collection>

时间:2010-07-29 19:55:57

标签: python

我正在尝试消除包含数千个自定义对象的数组的重复项。 为此,我正在为这些对象实现__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))

任何提示都非常感谢!

3 个答案:

答案 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__()