【发布时间】:2017-06-01 10:53:26
【问题描述】:
我们有一个类的实例列表。我们实际上想要一个Set,即没有重复元素的组。列表中相同的元素相等,但它们的哈希值不同,因为它们是单独实例化的。所以a==b 是True,a is b 是False。
有没有办法将这个问题向量化或以其他方式使其高效。我们能想到的唯一解决方案涉及 for 循环,而且似乎有更有效的解决方案。
编辑:我认为它与 "Elegant ways to support equivalence" 不同,因为等效性很好,只是 Set 依赖于比较哈希。
编辑:for 循环解决方案类似于,对列表进行排序,然后迭代,如果当前值与最后一个值相同,则删除当前值
编辑:明确地说,我们不拥有这个类,我们只有它的实例。所以我们可以包装实例并实现一个更有用的散列函数,但是,这似乎可能与 for 循环方法几乎一样昂贵 - 虽然可能是错误的
编辑:对不起,如果感觉我在这里移动了一些球门柱 - 没有一个简单的 val 可以替换为哈希的对象,这种方法需要以某种方式生成 UID每个不同的实例。
【问题讨论】:
-
是否可以以某种方式序列化状态,例如您可以将类转换为表示其状态的元组然后对其进行哈希处理吗?这些类是否具有可比性(即可排序)?
-
是的,
set需要它的项目是可散列的,所以你只需要实现一个合适的__hash__方法。并确保您的对象不会发生变异! -
"列表中相同的元素,但它们的哈希值不同" 你真的应该再考虑一下这个问题。哈希值是否有必要不同,或者您只是没有为实现
__hash__而烦恼?相等和散列不一致会引发大量问题,您刚刚遇到的第一个问题。 -
应该这样吗? > 循环将使用 O(n2) 来扫描整个列表,而通过哈希查找应该只需要 O(n) 在集合中。
标签: python