Python集合为何无法同时存入等值int和float,如何实现该存储需求
问题1:出现该现象的原因是什么?
Python 中集合元素去重、字典键唯一性的判定有两个必须同时满足的核心条件:
- 两个对象的哈希值(
hash()返回值)相等 - 两个对象的相等判断(
==运算)返回True
Python的数值类型设计中,9 == 9.0的运算结果为True,且两者的哈希值也完全相等,因此会被集合判定为重复元素,添加9.0时不会生效;字典中也会被判定为同一个键,导致后续赋值覆盖原有值。
问题2:如何才能将这两个元素同时添加到集合中?
你可以将数值和它的类型绑定为元组后再存入集合/作为字典键,利用元组的哈希和相等判定逻辑,区分开数值相等但类型不同的元素:
# 集合实现示例 s = {(int, 4), (float, 6.7), (float, 2.12), (int, 9)} # 添加整数9和浮点数9.0 s.add((int, 9)) s.add((float, 9.0)) print(s) # 输出包含{(int,9), (float,9.0)}两个元素 # 存在性判断符合需求 print((float, 9.0) in s) # 主动添加后返回True,未添加时返回False
# 字典实现示例 d = {} d[(int, 3)] = "整数3" d[(float, 3.0)] = "浮点数3.0" print(d) # 两个键会同时存在,分别映射不同的值
如果觉得每次写元组比较繁琐,也可以自定义封装数值类,重写__hash__和__eq__方法,将类型纳入判定逻辑即可。
内容的提问来源于stack exchange,提问作者Riccardo Bucco
相关产品推荐
相关产品推荐

