繁体   English   中英

如何基于平等而不是哈希有效地从python列表中删除重复项

[英]How to efficiently remove duplicates from a python list based on equality, not hashes

我们有一个类实例的列表。 我们实际上想要一个Set即没有重复元素的组。 列表中的元素相同,但是它们的哈希值不同,因为它们已分别实例化。 所以a==bTruea is bFalse

有没有一种方法可以向量化此问题或以其他方式使其高效。 我们可以想到的唯一涉及循环的解决方案,似乎可能会有一个更有效的解决方案。

编辑:我认为它与“支持等价的经典方法”不同,因为等价效果很好, Set依赖于比较哈希值。

编辑:for循环解决方案将类似于,对列表进行排序,然后遍历,如果当前值与最后一个值相同,则将其删除

编辑:要明确,我们不拥有此类,我们只有它的实例。 因此,我们可以包装实例并实现更有用的哈希函数,但是,这似乎和for循环方法几乎一样昂贵-尽管可能是错误的

编辑:对不起,如果它感觉就像我有点这里挪动门柱-没有一个简单的val可埋入式在哈希的对象,这种方法将需要以某种方式为每一个不同的实例的UID。

我假设您正在使用自己创建的类并且已经实现了自己的相等方法。

确实,从Object继承的默认哈希方法为不同的实例返回不同的值。 根据我的阅读,它是基于id()还是随机的,具体取决于Python版本。

但是,您可以轻松实现自己的__hash__方法来解决此问题。

如何在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM