在python中使用户定义的类可排序和/或可哈希化时,需要重写/实现哪些方法?
需要注意的陷阱是什么?
我输入dir({})
解释器以获取内置字典的方法列表。其中,我假设我需要一些实现
['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__']
与Python2相比,必须为Python3实现哪些方法有区别吗?
我差点把它作为对其他答案的评论,但这本身就是一个答案。
为了使您的项目可排序,它们只需要实现__lt__
。这是内置排序使用的唯一方法。
其他比较还是functools.total_ordering
仅在您确实要对类使用比较运算符时才需要。
为了使您的项目可散列,请__hash__
按照其他说明实施。您还应该__eq__
以兼容的方式实现-等效的项目应使用相同的哈希值。
说a我在python3中有一个数据类。我希望能够散列和排序这些对象。 我只想在id上订购/散列它们。 我在文档中看到,我可以只实现_hash_和所有这些,但我想让数据类为我做这些工作,因为它们旨在处理这些。
问题内容: 我正在尝试创建这种字典,但出现错误。我的petInfo结构是这样的: 因此,我想以某种方式使其可散列,但是其组成部分都不是要求的整数。如果其所有字段都不是整数,如何使它符合协议?如果我知道该结构在所有情况下都是唯一的,我可以使用吗? 问题答案: 只需从函数返回即可。仅供参考-哈希值不需要唯一。要求两个相等的对象也必须具有相同的哈希值。
问题内容: 在如何哈希列表?有人告诉我,我应该转换为一个元组第一,如到。 因此,第一个不能散列,而第二个可以散列。为什么*? *我并不是真正地在寻求详细的技术说明,而是在寻找一种直觉 问题答案: 主要是因为元组是不可变的。承担以下工作: 现在,当您这样做时会发生什么?您已修改字典中的键!远道而来!如果您熟悉哈希算法的工作原理,这会让您感到恐惧。另一方面,元组是绝对不变的。看起来好像是在修改元组,但
问题内容: 我了解为什么将可变对象放入字典很危险。但是,将所有列表/集合转换为元组/ frozensets是昂贵的;对于许多类型,根本没有容易获得的不可变版本。因此,有时值得直接散列可变对象,并采取适当的预防措施以确保所讨论的对象永远不会被修改。 在开始为可变对象实现非常复杂的自定义哈希函数之前,我想检查一下用作哈希函数是否存在任何缺点- 无论是在性能,碰撞还是其他方面。 问题答案: 出于类似的原
问题内容: 我需要一个可逆的哈希函数(显然,输入的大小将比输出小得多),该函数将输入以随机的方式映射到输出。基本上,我想要一种将“ 123”之类的数字转换为“ 9874362483910978”之类的较大数字的方法,但不是要保留比较的方法,因此,如果x1> x2,f(x1 )> f(x2)(但也不能始终为假)。 这种情况的用例是,我需要找到一种方法将小数字转换成看起来更大的随机数字。它们实际上并不
问题内容: 我想使用比较器按降序对对象进行排序。 在这里,我想对一个Person对象数组进行排序。 我怎样才能做到这一点? 问题答案: 你可以使用这种方法来覆盖用户定义的类的降序方法,从而覆盖compare()方法, 或通过使用用户Prince在其评论中提到的降序进行排序。 你可以像这样进行升序排序, 我们用简洁的Lambda表达式(从Java 8开始)替换上面的代码: 从Java 8开始,Lis