我在创建float
和int
数据类型集时遇到了一些问题,例如
my_set = {1.00 1}
我认为这是一组两个不同的元素,一个浮点1.00
和一个整数1
。但是,默认为:
>>> my_set
= set([1])
此处,float
消失,只剩下int
。由于1.00 in my_set
返回True.
我想知道是否有人能解释实际发生的事情?有办法解决这个问题吗?
答案 0 :(得分:4)
>>> 1 == 1.0
True
>>> hash(1) == hash(1.0)
True
Python认为两者在集合中使用和作为映射键完全相同。解决这个问题的唯一方法是将两个值都包装在一个自定义类中,该类将上述任一比较评估为false。
答案 1 :(得分:1)
Hint:
>>> a = 1
>>> b = 1.00
>>> a.__hash__()
1
>>> b.__hash__()
1
答案 2 :(得分:1)
我认为这是一组两个不同的元素,一个浮动1.00和一个整数。
这是你的问题。 Python认为它们是一个元素,第一。这个数字是表示为浮点数还是int数并不会改变它是相同数字的事实。
答案 3 :(得分:1)
我想知道是否有人能解释实际发生的事情?是 有办法解决这个问题吗?
给出的解释应该足够了。我能看到的最简单的方法是,如果您从用户那里获得此输入,则在将其存储到集合中之前不要将其转换为数字形式。
更复杂的方法是将条目存储为(值,类型)的元组:{(1, int), (1, float)}
,但这对我来说似乎完全是疯了。
我建议你在根据用户提供的表示形式区分两个相等的数字之前,先考虑很久。
答案 4 :(得分:1)
正如其他答案所解释的那样,因为(int)1和(float)1.0具有相同的散列和测试为equals,所以就Set而言,它们是相同的。< / p>
有时语言/标准库会有一个IdentitySet
类来收集确切的对象(通过&#39; identity&#39;)而不是相等。
另一个问题的答案 - https://stackoverflow.com/a/16994637/130288 - 显示了Python的一个小IdentitySet
实现。它将插入的对象包装在另一个类Ref
中,以强制进行身份比较 - 大致与Ignacio的回答一样。
答案 5 :(得分:0)
因为(int)1和(float)1.0具有相同的散列,所以你不能得到一个同时具有1和1.0的集合
您可以改为实现自己的设置。使用type()来区分int和float