为什么没有Python集的查找方法?

Hel*_*hne 0 python set

在Python,对象可以是尽管不是同一对象(等于==相对于is).考虑以下任意对象的序列obj1obj2.

assert obj1 == obj2
assert obj1 is not obj2
s = set((obj1,))
del obj1
Run Code Online (Sandbox Code Playgroud)

有以获得一般且有效的方法obj1sobj2(对于任意大的集s发生在包含一个对象,它等于被查找的)?(似乎依赖set.intersect单身人士set的结构并不可靠.)

如果没有,为什么?

显而易见的替代方法是使用dict每个键存储为其自身值的位置.目前尚不清楚与set基于预期的方法相比,处理废物的内存量是多少.

Mar*_*ers 7

不,套不是映射,如果obj1 == obj2,它应该没关系.集合用于测试成员资格并保存唯一(由相等定义),而不是映射回特定对象.请改用字典.

否则,您必须迭代并选择一个相等的对象:

obj1 = next(ob for ob in s if ob == obj2)
Run Code Online (Sandbox Code Playgroud)

Python中的集合属于dict类型,在添加集合之前(在sets模块形式的2.3中,然后作为内置类型),您使用了映射所有键的字典None来跟踪唯一值.添加"查找"功能将撤消此专业化; 没有必要为字典已经提供的集合添加功能,特别是因为字典已经发展了许多其他集合功能,例如集合代数操作.

  • @HelmutGrohne:再说一遍,没有用例.软件中的所有功能都有成本,而且成本是合理的.集合不用于将相等性映射到唯一对象,而不是在已经有字典时.字典做查找就好了.集合被添加到Python语言中,因为字典用于查找唯一值(将所有内容映射到"无").那么为什么又有另一种方式呢? (2认同)