[英]How to efficiently remove duplicates from a python list based on equality, not hashes
我们有一个类实例的列表。 我们实际上想要一个Set
即没有重复元素的组。 列表中的元素相同,但是它们的哈希值不同,因为它们已分别实例化。 所以a==b
为True
, a is b
为False
。
有没有一种方法可以向量化此问题或以其他方式使其高效。 我们可以想到的唯一涉及循环的解决方案,似乎可能会有一个更有效的解决方案。
编辑:我认为它与“支持等价的经典方法”不同,因为等价效果很好, Set
依赖于比较哈希值。
编辑:for循环解决方案将类似于,对列表进行排序,然后遍历,如果当前值与最后一个值相同,则将其删除
编辑:要明确,我们不拥有此类,我们只有它的实例。 因此,我们可以包装实例并实现更有用的哈希函数,但是,这似乎和for循环方法几乎一样昂贵-尽管可能是错误的
编辑:对不起,如果它感觉就像我有点这里挪动门柱-没有一个简单的val
可埋入式在哈希的对象,这种方法将需要以某种方式为每一个不同的实例的UID。
我假设您正在使用自己创建的类并且已经实现了自己的相等方法。
确实,从Object
继承的默认哈希方法为不同的实例返回不同的值。 根据我的阅读,它是基于id()
还是随机的,具体取决于Python版本。
但是,您可以轻松实现自己的__hash__
方法来解决此问题。
__hash__
应该为相等的对象返回相同的值。 它也不应在对象的整个生命周期内发生变化。 通常,您只为不可变的对象实现它。
这可能不是您想要的答案,但这是一种干净且容易的方法。 然后,您可以正常创建Set
。
也许这就是您所需要的? 使散列成为类字段的函数。
这是一个简单的示例:
class A:
def __init__(self, v):
self.val = v
def __eq__(self, other):
return self.val == other.val
def __hash__(self):
return self.val
def __repr__(self):
return 'A(%s)' % self.val
a = set([A(2), A(3), A(4), A(2), A(10), A(4)])
print(a)
# {A(10), A(2), A(3), A(4)}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.