我想在一个集合中存储一个类的实例,所以我可以使用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
答案 0 :(得分:1)
由于评论中的一些问题,我想出来了 - 问题是由于我相信最终,哈希函数决定两个对象是否相同。 __eq__
也需要匹配,它在我的测试中总是这样做,并试图在这里创建一个最小的例子。
但是,当在prod中从数据库中提取数据时,某个浮点数正在向下舍入,因此x == y
在生成中失败。哎呀。