如何使用__contains__ /"在"中搜索Python列表中的对象关键词?

时间:2016-05-04 17:33:38

标签: python list contains

我想列出我定义的对象列表,然后使用in关键字(调用__contains__)来确定Python列表中是否存在所述对象。

这是一个带注释的最小例子:

>>> class Foo(object):
...     def __init__(self, name):
...             self.name = name
...     def __contains__(self, item):
...             return self.name == item
... 
>>> list_of_objects = [Foo("bar"), Foo("baz"), Foo("quux")]
>>> # I want to see if "bar" is in this list of Foo() objects
>>> Foo("bar") in list_of_objects
False      # <-- I want this to be True

不应该in关键字迭代Python列表并使用__contains__方法来确定对象的存在吗?

如果对列表index()功能的调用也可以运行,则会有额外的荣誉。

更新

感谢@ user2357112,看起来答案是实现等价运算符__eq__。将以下位添加到上一个示例中的Foo类可以解决我遇到的问题。

>>> class Foo(object):
...     def __init__(self, name):
...             self.name = name
...     def __eq__(self, other):
...             return other.name == self.name
>>> list_of_objects = [Foo("bar"), Foo("baz"), Foo("quux")]
>>> Foo("bar") in list_of_objects
True

1 个答案:

答案 0 :(得分:5)

__contains__是在容器上调用的方法,而不是在元素上调用的方法。您需要实现__eq__

class Foo(object):
    def __init__(self, name):
        self.name = name

    def __eq__(self, other):
        if isinstance(other, Foo):
            return other.name == self.name
        return self.name == other

如果您要将Foo存储在其他容器中(例如set),请记住实施__hash__