Python3中的唯一类实例

马卡龙诺斯

假设我有一个这样的类定义

class structure:
    def __init__(self, handle):
        self.handle = handle

如何使用numpy.uniquePython3的另一种工具或Python3的另一种工具在此类实例的列表中查找唯一元素?应该根据'handle'字段的值进行比较

马丁·彼得斯(Martijn Pieters)

numpy.unique不是自定义类的最佳工具。使您的实例可哈希化(实现__hash____eq__),然后使用一组将实例列表简化为唯一值:

class structure:
    def __init__(self, handle):
        self.handle = handle

    def __hash__(self):
        return hash(self.handle)

    def __eq__(self, other):
        if not isinstance(other, structure):
            # only equality tests to other `structure` instances are supported
            return NotImplemented
        return self.handle == other.handle

集合可以有效地通过哈希检测重复项,从而确认具有相同哈希的对象也首先相等。

要获取唯一的实例,只需调用set()一系列实例:

unique_structures = set(list_of_structures)

演示:

>>> class structure:
...     def __init__(self, handle):
...         self.handle = handle
...     def __hash__(self):
...         return hash(self.handle)
...     def __eq__(self, other):
...         if not isinstance(other, structure):
...             # only equality tests to other `structure` instances are supported
...             return NotImplemented
...         return self.handle == other.handle
...     def __repr__(self):
...         return '<structure({!r})>'.format(self.handle)
...
>>> list_of_structures = [structure('foo'), structure('bar'), structure('foo'), structure('spam'), structure('spam')]
>>> set(list_of_structures)
{<structure('bar')>, <structure('foo')>, <structure('spam')>}

要考虑到structure存储在集合或使用的字典键中的任何实例的哈希值都不能改变; handle在实例的生存期内不更改属性是确保这一点的最简单方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章