首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使list子类可hashable

使list子类可hashable
EN

Stack Overflow用户
提问于 2012-04-21 05:26:24
回答 3查看 2.1K关注 0票数 0

我想从list派生一个类,向其添加一些实例属性,并使其可哈希。什么是一个好的(快速和整洁的)方法?

更新:

我删除了一个用例的冗长解释。我还将一个相关但独立的问题移到了different question中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-21 05:32:39

这段代码没问题。您正在制作列表的副本,这可能会有点慢。

代码语言:javascript
复制
def __hash__(self):
    return hash(tuple(self.list_attribute))

如果你想要更快,你有几个选择。

  • list_attribute存储为元组,而不是列表(在初始化时完全初始化散列一次并存储散列值之后)。你可以这样做,因为你的类是不可变的,所以散列永远不会改变。
  • 编写你自己的散列函数。这是hash function for tuple,做些类似的事情。
票数 1
EN

Stack Overflow用户

发布于 2012-04-21 06:01:17

您可以对self应用tuple

代码语言:javascript
复制
class State(list):
    def __hash__(self):
        return hash((self.some_attribute, tuple(self)))

tuple-ing self占用了整个散列过程的大约一半时间:

代码语言:javascript
复制
from timeit import timeit

setup = "from __main__ import State; s = State(range(1000)); s.some_attribute = 'foo'"
stmt = "hash(s)"
print(timeit(stmt=stmt, setup=setup, number=100000))

setup = "r = list(range(1000))"
stmt = "tuple(r)"
print(timeit(stmt=stmt, setup=setup, number=100000))

打印

代码语言:javascript
复制
0.9382011891054844
0.3911763069244216
票数 1
EN

Stack Overflow用户

发布于 2012-04-21 06:21:32

与其说这是一个答案,不如说它是一个评论,但它太长了,不能成为一个评论。这就是从__new__内部访问实例属性的方式

代码语言:javascript
复制
class Data(tuple):
    def __new__(klass, arg):
        data_inst = tuple.__new__(klass, arg)
        data_inst.min = min(data_inst)
        data_inst.max = max(data_inst)
        return data_inst

>>> d = Data([1,2,3,4])
>>> d
(1, 2, 3, 4)
>>> d.min
1
>>> d.max
4
>>> d1 = Data([1,2,3,4,5,6])
>>> d1.max
6
>>> d.max
4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10253783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档