python set()成员资格和可散列对象

时间:2017-11-02 19:59:36

标签: python python-2.7

我想在一个集合中存储一个类的实例,所以我可以使用set方法来查找交集等。我的类有一个List<Long> newList = new ArrayList<Long>(); for(Long l : target) { if(newList.isEmpty() || !l.equals(newList.get(newList.size()-1))) { newList.add(l); } } 函数,以及一个__hash__()和一个{ {1}},并使用__eq__

进行修饰

当我创建两个集合,每个集合包含相同的两个对象,然后执行__lt__时,我得到一个带有单个对象的结果,我不明白为什么。我没想到,或者至少是2,这表明我对集合的工作原理完全失败了。但是一个?

functools.total_ordering

为什么set_a.difference(set_b)中的for a in set_a: print(a, a.__hash__()) for b in set_b: print(b, b.__hash__(), b in set_a) (<foo>, -5267863171333807568) (<bar>, -8020339072063373731) (<foo>, -5267863171333807568, False) (<bar)>, -8020339072063373731, True) 对象不被视为<foo> set_b?对象需要什么其他属性才能被视为集合的成员?为什么in被认为是set_a的一部分,而不是bar呢?

编辑:使用更多信息进行更新。我认为只是显示两个对象'哈希()的结果相同意味着它们确实相同,所以我想这可能是我的错误所在。

set_a

1 个答案:

答案 0 :(得分:1)

由于评论中的一些问题,我想出来了 - 问题是由于我相信最终,哈希函数决定两个对象是否相同。 __eq__也需要匹配,它在我的测试中总是这样做,并试图在这里创建一个最小的例子。 但是,当在prod中从数据库中提取数据时,某个浮点数正在向下舍入,因此x == y在生成中失败。哎呀。