如何使用等效对象访问集合的元素?

Jan*_*ila 16 python set object-identity

如果我有一个比较等于Python集合的元素但不是同一个对象的对象,是否有合理的方法来获取对集合中对象的引用?用例将使用该集来识别和共享重复数据.

示例(Python 2.7):

>>> a = "This is a string"
>>> b = "This is a string"
>>> a is b
False
>>> a == b
True
>>> s = set((a,))
>>> b in s
True
Run Code Online (Sandbox Code Playgroud)

如何获得a使用bs?我可以想到一种方法,但我不确定它是否与实现无关,无论你是否得到ab.编辑:当s有多个元素时,这不起作用; 交集很自然地实现了类似的东西[x for x in smaller_set if x in larger_set]

>>> for x in set((b,)).intersection(s): c = x
...
>>> c is a
True
Run Code Online (Sandbox Code Playgroud)

也许一个好的解决方法是使用将每个键映射到自身的字典而不是集合.

Jan*_*ila 5

我在python-list上找到了一个类似的问题:从set中获取项目.参考get_equivalent(容器,项目)(Python配方)有一个聪明的答案.

诀窍是为'key'对象构造一个包装器对象,并使用in运算符检查包装器是否在集合中.如果包装器哈希值等于键,则其__eq__方法可以访问集合中的对象,并保存对它的引用.讨论的一个重点是__eq__set元素的方法必须返回NotImplemented无法识别的类型,否则__eq__可能无法调用包装器.