为何将pandas生成字典的numpy.int64类型键转为原生int后,键类型仍未改变?
为什么字典键的类型没被替换?
这其实是Python字典键的相等性与哈希机制在起作用,咱们一步步拆解你的代码逻辑:
核心原因:numpy.int64和原生int的"等价性"
在Python里,字典判断两个键是否是同一个,看的是两个关键条件:
- 两者的哈希值相等(
hash(np.int64(0)) == hash(0)结果为True) - 两者比较相等(
np.int64(0) == 0结果也为True)
所以当你执行d.update({k_nat:1})时,Python会认为k_nat(原生int 0)和原字典里的np.int64(0)是同一个键——它只会把这个键对应的值从None更新为1,而不会替换键本身的类型,原字典里的键还是最初的numpy.int64对象。
关于你看到的"矛盾"输出
你打印字典时看到的{0: None}和{0: 1},其实是Python的"友好显示"——它会把np.int64(0)简化显示成0,但底层存储的键类型并没有改变,这也是为什么最后循环打印键类型时,结果还是<class 'numpy.int64'>。
如何真正把键转换成原生int?
如果你想把所有numpy.int64类型的键替换成原生int,有两种可靠的方式:
方法1:字典推导式创建新字典(推荐)
import numpy as np d = {np.int64(0): None, np.int64(1): "hello"} # 遍历原字典,将每个键转为原生int new_d = {int(k): v for k, v in d.items()} # 验证类型 for k in new_d.keys(): print(type(k)) # <class 'int'>
方法2:原地修改字典
import numpy as np d = {np.int64(0): None, np.int64(1): "hello"} # 先把所有键存入列表,避免遍历过程中字典结构变化引发错误 keys = list(d.keys()) for k in keys: if isinstance(k, np.int64): # 取出旧键对应的值并删除旧键 value = d.pop(k) # 添加新的原生int键和对应值 d[int(k)] = value # 验证类型 for k in d.keys(): print(type(k)) # <class 'int'>
内容的提问来源于stack exchange,提问作者darbocks
相关产品推荐
相关产品推荐

