在Python中,尽管不是同一个对象(==
与is
),但对象可以相等。对于任意对象obj1
和obj2
,请考虑以下序列。
assert obj1 == obj2
assert obj1 is not obj2
s = set((obj1,))
del obj1
是否有一种通用而有效的方法可以从obj1
和s
获取obj2
(对于任意大的集合s
,包含一个等于一个的对象被抬头)? (似乎依赖set.intersect
单身set
的构造不可靠。)
如果没有,为什么?
显而易见的替代方法是使用dict
,其中每个键都存储为自己的值。目前尚不清楚与基于预期set
的方法相比,浪费了多少内存。
答案 0 :(得分:7)
不,设置不是映射,如果obj1 == obj2
,则无关紧要。集合用于测试成员资格并保存唯一的值(由相等定义),而不是映射回特定对象。请改为使用字典。
否则,您必须迭代并选择一个相等的对象:
obj1 = next(ob for ob in s if ob == obj2)
Python中的集合来自dict
类型,因为在添加集合之前(在sets
module的形式中为2.3,然后作为built-in type),您使用了将所有键映射到None
以跟踪唯一值的字典。添加“查找”功能将撤消此专业化;没有必要为字典已经提供的集合添加功能,特别是因为字典已经发展了许多其他集合功能,例如集合代数操作。