如何使用“uuu包含”搜索Python列表中的对象;在;关键词?
我想创建一个我定义的对象列表,然后使用如何使用“uuu包含”搜索Python列表中的对象;在;关键词?,python,list,contains,Python,List,Contains,我想创建一个我定义的对象列表,然后使用in关键字(whichcalls)来确定Python列表中是否存在所述对象 下面是一个带有注释的最小示例: >>> class Foo(object): ... def __init__(self, name): ... self.name = name ... def __contains__(self, item): ... return self.name == item
in
关键字(whichcalls)来确定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
\uuuuu contains\uuuu
是在容器上而不是在元素上调用的方法。您需要实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
:
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
),请记住在对象列表中执行时实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,然后调用列表。它不会也绝对不应该调用Foo.\uuu包含\uuu
,仅仅因为列表包含Foo
实例,并且不清楚您为什么认为应该这样。这是可以理解的,但问题仍然是,如何才能做到?覆盖列表。\uuu包含\uuuuu
?,这显然是一个坏主意…当你在做的时候,你还应该定义\uuu新的\uuuu
,或者==
和=代码>将彼此不一致。如果对象是可变的,则不应定义\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,而应设置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。无论您是否计划使用,都应该处理这些事情=使用这些对象进行编码>、设置或记录,因为现在获取这些对象要比尝试调试那些疯狂的事情容易得多,如果您忘记了自己没有处理任何这些事情,那么以后将发生这些事情。这是正确的答案,
中的操作符在迭代列表时使用\uuueq\uuuuuu
。我将此添加到代码中,效果很好。谢谢。@user2357112实际上,这适用于Python 2。在Python3中,\uuuu ne\uuuuuu
将反转\uuuuu eq\uuuuu
,并使用\uuuu eq\uuuuuu
对象,但如果没有\uuu hash\uuuuuu
则不可哈希。@bereal:是的,这些都是Python3的好功能。不过,在这个问题上,Python 3并没有什么特别之处。
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