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

Python 如何使用等效对象访问集合的元素?,python,set,object-identity,Python,Set,Object Identity,如果我有一个与Python集合中的一个元素进行比较的对象,但不是同一个对象,那么有没有合理的方法来获取集合中对象的引用?用例将使用集合来识别和共享重复的数据 示例(Python 2.7): 如何使用b和s获取对a的引用?我可以想到一种方法,但我不确定它是否与实现无关,您是得到a还是b编辑:当s有多个元素时,此选项不起作用;交集是很自然地实现的,比如[x在较小的集合中表示x,如果x在较大的集合中表示x] >>> for x in set((b,)).intersection(s)

如果我有一个与Python集合中的一个元素进行比较的对象,但不是同一个对象,那么有没有合理的方法来获取集合中对象的引用?用例将使用集合来识别和共享重复的数据

示例(Python 2.7):

如何使用
b
s
获取对
a
的引用?我可以想到一种方法,但我不确定它是否与实现无关,您是得到
a
还是
b
编辑:当s有多个元素时,此选项不起作用;交集是很自然地实现的,比如
[x在较小的集合中表示x,如果x在较大的集合中表示x]

>>> for x in set((b,)).intersection(s): c = x
...
>>> c is a
True

也许一个好的解决方法是使用dict将每个键映射到自己,而不是集合。

您的用例听起来像是字典的用例。将与“外来”对象进行比较的对象属性用作键,并将所需对象本身用作值

如果这是一个简单的用例,您可以使用线性seartch,但是,您可以做显而易见的事情-这不会很糟糕:

def get_equal(in_set, in_element):
   for element in in_set:
       if element == in_element:
           return element
   return None 

如果您需要您所要求的(我想知道一些使用案例),wya要做的是创建一个自定义字典类,该类的一个成员是集合,实现成员集的代理方法,并且在dictionary和set方法中保持字典和集合内容的同步。这将是一个耗时的正确实现,但相对简单

我在python列表中发现了一个类似的问题:。关于这个问题有一个聪明的答案


诀窍是为“key”对象构造一个wrapper对象,并使用
in
操作符检查wrapper是否在集合中。如果包装散列等于键,则其
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。讨论中的一个重要观点是,对于无法识别的类型,set元素的
\uuuu eq\uuuu
方法必须返回
NotImplemented
,否则包装器的
\uuuuuuueq\uuuu
可能无法调用。

如果需要两个相等的、可哈希对象中的一个,对象似乎不应该是相等的和/或可散列的。你为什么需要这个?我认为你的怀疑是有道理的:PyPy1.7.0和IronPython3.0都(可以)为你的最终c是a返回False。我可以通过将对相同对象的引用更改为对相同对象的引用来节省内存。我可以使用dict,就像我在最后一句中提到的那样。我在问我是否遗漏了什么。
def get_equal(in_set, in_element):
   for element in in_set:
       if element == in_element:
           return element
   return None