Python:访问集合的成员

Python:访问集合的成员,python,python-3.x,set,Python,Python 3.x,Set,假设我有一组自定义对象,它们可能相等,尽管它们的引用不同(a==b,a不是b)。现在,如果我add(a)到集合中,Python正确地假设myset中的a和myset中的b,即使集合中只有len(myset)==1对象 这是清楚的。但是现在是否可以仅使用b从集合中提取a的值?假设对象是可变的,我想同时更改它们,忘记了对a的直接引用。换句话说,我正在寻找myset[b]操作,该操作将准确返回集合的成员a 在我看来,类型set无法做到这一点(比遍历其所有成员更快)。如果是这样,至少有一个有效的解决方法

假设我有一组自定义对象,它们可能相等,尽管它们的引用不同(
a==b,a不是b
)。现在,如果我
add(a)
到集合中,Python正确地假设myset中的
a和myset中的b
,即使集合中只有
len(myset)==1
对象

这是清楚的。但是现在是否可以仅使用
b
从集合中提取
a
的值?假设对象是可变的,我想同时更改它们,忘记了对
a
的直接引用。换句话说,我正在寻找
myset[b]
操作,该操作将准确返回集合的成员
a


在我看来,类型
set
无法做到这一点(比遍历其所有成员更快)。如果是这样,至少有一个有效的解决方法吗?

我认为
set
不支持在O(1)时间内检索项目,但您可以使用
dict

d = {}
d[a] = a
retrieved_a = d[b]

如果您只有
myset
b
,那么从这个角度来看,您将无法访问
a
,因为它不在那里。如果您创建多个可变对象,并将其中一个添加到
myset
中,那么当您仅处理
myset
或您添加的对象时,其他对象将不“已知”

如果要修改
a
b
,则需要在某处跟踪这两个对象。

可能是这样的:

(myset - (myset - set([b]))).pop() is a

你为什么要这么做?如果你已经有了
b
,为什么你需要
a
,这是一个相当大的要求…@KarlKnechtel:集合中的元素是从其他地方(从深层结构中)引用的,我想更改它的值。这些对象基本上是2D矢量类型的,它们是可变的。@emu:等等,什么?您不能改变dict键或set条目;它(可能)会更改哈希并破坏dict/set。你可以使用一个dict,其中键是“值”,值是一个列表或一组具有该值的元素,但你不应该在“左边”变异任何东西。@DSM:Oops,我怎么可能没有意识到?这个问题仍然有意义,因为我可以修改一个不影响散列或相等比较的属性。但对于我的原始案例,它是无用的,所以无论如何,我将不得不以不同的方式编写它。谢谢事实上,我在前一段时间用这个工具研究了源代码,IIRC,cpython在寻找交叉点时总是迭代较小的集合。所以你所拥有的一切都是有效的,但是如果
s
更长,这将返回
b
@senderle:我想你是对的-。然后我的第二种方法失败了,所以我要删除它。感谢您指出这一点。它是有效的,但集合差异(即第一个差异)很可能需要Python逐个删除所有元素。正因为如此,它的渐进速度与在集合中迭代的速度一样慢。@emu:也许吧,不过我想可能会对边缘情况进行一些优化。不管怎么说,恐怕这是唯一一种只使用集合的方法,而不使用dicts或线性搜索。