Python*列表*”;在;运算符:相等、哈希检查或标识?

Python*列表*”;在;运算符:相等、哈希检查或标识?,python,operators,contains,Python,Operators,Contains,评论中的人要求我提供我的实际代码,所以我删除了旧的示例 我正在制作,我想要两个标题相同的页面s来进行比较。我已经对Page类执行了以下操作: def __eq__(self, other): return self.title == other.title 但如果我这样做,那就不是真的: >>> import mw_api_client as mwc >>> w = mwc.Wiki('https://en.wikipedia.org/w/api.p

评论中的人要求我提供我的实际代码,所以我删除了旧的示例

我正在制作,我想要两个标题相同的
页面
s来进行比较。我已经对Page类执行了以下操作:

def __eq__(self, other):
    return self.title == other.title
但如果我这样做,那就不是真的:

>>> import mw_api_client as mwc
>>> w = mwc.Wiki('https://en.wikipedia.org/w/api.php')
>>> a = [w.page(str(i)) for i in range(20)]
>>> w.page('0') in a
False

我如何才能做到这一点?

列表的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法记录在此处的“成员资格测试”部分:

对于容器类型,如list、tuple、set、frozenset、dict或collections.deque,表达式
y中的x
相当于
any(x是e或x==e表示y中的e)

对于您的特定用例,您需要覆盖列表中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但是您不能只覆盖列表中的

a = []
a.__contains__ = lambda: True
AttributeError: 'list' object attribute '__contains__' is read-only
因此,解决方案是创建一个包装列表的自定义类,并提供它自己的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法。类似于以下内容(注意,在本例中,我使用的是dicts,因此
obj['title']
而不是
obj.title
——您可能还需要在
\uuuuu contains\uuu
中测试更多内容,例如类型比较等)。我在这里使用
UserList
,因为它提供了一个很好的
list
类来继承,并使列表内容在
数据中可用:

from collections import UserList

class MyList(UserList):
    def __init__(self, lst):
        self.data = lst

    def __contains__(self, obj):
        """Return True if any item in the list has a title, and the title matches that of the passed-in dict"""
        return any(obj['title'] == x['title'] for x in self.data if 'title' in x)

mr = {"title": "mr"}
mrs = {"title": "mrs"}
dr = {"title": "dr"}
random = {"foo": "bar"}


x = [mr, mrs, random]

y = MyList(x)

print(mr in y) # True
print(dr in y) # False
y.append(dr)
print(dr in y) # True

我试着运行你的代码,得到了正确的结果。同样,在这里,运行代码,得到了正确的结果。在
中,使用了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,我在一个普通列表中有几个这样的对象。我很清楚地知道,
中的
使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法使用什么来检查它是否包含对象?我使用什么方法使它成为这样,当我检查与列表中某个对象具有相同特定属性的对象时,
中的
返回True?问题是我有一个常规的自定义对象列表,如果对象具有相同的属性,我希望检查相同类型的另一个自定义对象是否在正常列表中,以返回True。我的问题不是我希望这个类在包含某些内容时返回true。我已经更新了我认为是您遇到的特定问题的答案-如果我误解了这个问题,请告诉我。嗯,这看起来很好。但是,我希望此模块的用户不必采取这些措施来检查页面是否在列表中-我希望其他人可以简单地在y
中键入
mr,其中
y
是一个简单的列表,而不必制作自定义列表。有没有办法修改包含的类来实现这一点,而不是修改包含的类?只需这样做,您的模块就不会返回普通列表,而是始终使用此自定义列表类来包装它。它将继续像一个列表一样工作,但有这种特殊的
\uuuu包含\uuuu
行为。问题是,模块从来没有交回一个简单的列表-它实际上使用生成器;但用户可能希望将这些生成器转换为列表。一个示例用例是获取一个链接到“需要引用”的页面列表,然后从该列表中删除任何链接到“不准确”的页面。有没有办法让一个列表将两个标题相同的页面同等对待?或者列表是否为
操作符中的
使用标识,这意味着我必须找到其他方法来简化该操作?