如何在python中过滤列表中的对象?

时间:2018-11-06 10:54:48

标签: python python-3.x

我正在使用python 3.6。创建两个列表。如果所有实例属性值都相同,我想对其进行过滤。

我写了这段代码,但返回false。 如何过滤?

class MyCls:
    def __init__(self, **kwargs):
        self.x = kwargs.get('x')
        self.y = kwargs.get('y')
        self.z = kwargs.get('z')

    def __str__(self):
        return str(self.__dict__)

    def __hash__(self):
        return hash(str(self.__dict__))

    def __eq__(self, other):
        return str(self.__hash__) == str(other.__hash__)


a = MyCls(x='a', y='b', z='c')
b = MyCls(x='a', y='b', z='c')

ab = [a, b]

print(a is b)
# False
print(a == b)
# False

s = set(ab)
print(s)
# print(2 instances)

1 个答案:

答案 0 :(得分:4)

我回答的前提是您出于教育目的而玩__hash____eq__

我发现您的哈希和相等方法...很奇怪。

无论如何,您的代码的具体问题是__eq__没有调用__hash__方法。

您可以使用

return str(self.__hash__()) == str(other.__hash__())

__eq__中-或更高(但仍然很奇怪)

return hash(self) == hash(other)

通过此调整,您将得到

>>> hash(a)
>>> 8280333490847949293
>>> hash(b)
>>> 8280333490847949293
>>> a == b
>>> True

但是,此设计的一个基本缺陷是MyClass的实例将与意外地对其进行哈希处理的任何其他对象进行比较。

>>> class C:
...:    def __hash__(self):
...:        return 8280333490847949293
...:    
>>> C() == a
>>> True

如果要比较实例属性,为什么不直接比较实例字典呢?