是否有类似Set的对象不存储值?

时间:2012-05-19 14:00:19

标签: python set

我想要一种数据类型,它可以让我有效地跟踪已被添加的对象"对它,允许我测试会员资格。我不需要任何其他功能。

据我所知,Python没有这样的数据类型。最接近我想要的是Set,但该集将始终存储值(我不需要)。

目前我能想到的最好的方法是获取每个对象的hash()并将其存储在一个集合中,但是在较低级别,正在计算散列的散列,并且正在存储散列字符串作为一种价值。

有没有办法只使用Sets的低级查找功能而不实际指向任何东西?

2 个答案:

答案 0 :(得分:3)

基本上,不,因为,正如我在评论中指出的那样,两个不相等的对象完全可以共享相同的哈希键。

散列键不是指向任何内容或对象,而是指向包含零个或多个对象的存储桶。然后,set实现需要对每个对象进行相等比较,以确定对象是否在集合中。

因此,您始终需要至少足够的信息来进行相等比较。如果您有非常大的对象,可以根据其数据的子集(例如2或3个字段)确定相等性,则可以考虑仅使用这些字段创建新对象并将其存储在集合而不是整个对象中

答案 1 :(得分:0)

weakref模块实现了一堆容器,可以测试成员资格而无需存储"值,缺点是当对象的最后一个强引用被删除时,对象从弱容器中消失。

如果这适合您,WeakSet就是您想要的。

如果这对你不起作用,那么你似乎想要Bloom filter这是可能的(有误报),但为了你的目的而健壮(默认不是假阴性)。

典型的安排是"尝试过滤器,如果不是,它是否;如果是,请检查缓慢的方式,例如文件中的单词列表"