>>> a = {('0xFFFA', 11): 32, ('0x00F3', 1): 1, ('0xFFFA', 2): 42}
{('0xFFFA', 1): 32, ('0x00F3', 1): 1, ('0xFFFA', 2): 42}

如上,字典的键值是一个元组,元组的关键键值是由两个元素组成的:

(字符串, 数值)

想要把这个字典ajson形式保存下来,则会报错:

with open('a_dict.json', 'w') as json_obj:json.dump(a, json_obj)
# TypeError: keys must be str, int, float, bool or None, not tuple

错误的信息为:虽然python允许你的字典键值为元组,但是我json不认同,你的字典键值不可以是元组,此时应该怎么办呢?

我想到了两个方法:

  • 第一个方法是把数据转换为层次型数据,建立两层索引;
  • 第二个方法是,将元组类型转换为字符串来记录信息

第二个方法较好实现,且不会改变数据的原有关系。

with open('a_dict.json', 'w') as json_obj:a = json.dumps({str(k): a[k] for k in a})json.dump(a, json_obj)

加了一句话a = json.dumps({str(k): a[k] for k in a}),表示把a中的键值全部转换为字符串。

现在的a就是下面这个样子:

{"('0xFFFA', 1)": 32, "('0x00F3', 1)": 1, "('0xFFFA', 2)": 42}

这衍生出一个新问题,就是读数据a._dict.json时,读到的数据也是以字符串为索引的,这就需要我们见招拆招,根据情况,写一个能把字符串转为tuple元组的函数。

>>> key = "('0xFFFA', 1)"
>>> _str2tuple(key)
('0xFFFA', 1)

下面开始写_str2tuple

def _str2tuple(key):# 注意python切片 左开右闭 的性质fore = key[2:8]back = key[11, -1]return tuple(fore, back)

读取数据的只需要按照下面的方式来即可:

with open('a_dict.json','r') as load_obj:a = json.load(load_obj)"""把文件字符串转成字典"""a = json.loads(a)a = {_str2tuple(k): a[k] for k in a}

TypeError: keys must be str, int, float, bool or None, not tuple,解决 python 中 json 保存不了字典键值为 元组 的问题相关推荐

  1. 一木.溪桥学Python-04: Python基础数据类型int ,float ,bool ,complex,None,str, 转义字符

    一木.溪桥 在Logic Education跟Amy学Python 12期:Python基础课 一木.溪桥学Python-04: Python基础数据类型int ,float ,bool ,compl ...

  2. python 错误分析 TypeError: can only concatenate str (not “float“) to str

    1. (can only concatenate str (not "float") to str 代码DeBug日志 print("总价为"+money) 1 ...

  3. 成功解决Python中出现的TypeError: object of type 'zip' has no len()

    成功解决Python中出现的TypeError: object of type 'zip' has no len() 不罗嗦,直接解决问题! 目录 解决问题 解决思路 解决方法 解决问题 TypeEr ...

  4. 解决python中TypeError: not enough arguments for format string

    解决python中TypeError: not enough arguments for format string for i in range(1,10):​ for j in range(1,i ...

  5. python中json与str转换和出现KeyError的解决方法

    python中json与str转换和出现KeyError的解决方法 json转str str转json KeyError的解决方法 json转str json格式的数据其实就是dict类型的数据,如图 ...

  6. 解决Python中sum函数出现的TypeError: unsupported operand type(s) for +: 'int' and 'list'错误问题

    当在Python中运行sum函数时,会出现"TypeError: unsupported operand type(s) for +: 'int' and 'list'"这样的问题 ...

  7. python中float函数作用_解析要在Python中浮动的字符串(float()函数)

    给定一个字符串值(包含浮点值),我们必须在Python中将其转换为浮点值. 要将字符串值转换为float,我们使用float()功能. Python float() 功能 float()functio ...

  8. TypeError: can only concatenate str (not “float“) to str

    处错原因如下 就是print 的地方报错了,类型不一样引起的问题 处理这个问题有2种方法 方法1: 转换类型 pi = 3.14 print("当前的p=" + str(pi)) ...

  9. 解决Python中字典出现“TypeError: 'dict_keys' object does not support indexing”错误

    "TypeError: 'dict_keys' object does not support indexing"错误,是因为python3以后的版本改变了dict.keys的返回 ...

最新文章

  1. 95 后哈佛小哥撰写《从零开始的机器学习》,入门必备,书籍资源已开放
  2. cocos2d-x游戏开发系列教程-坦克大战游戏之坦克的显示
  3. 第五个页面:更多电影页面
  4. java的常见异常与错误总结
  5. flex 鼠标放在组件上变手型
  6. 《我的青春谁做主》我想要的结局
  7. Java并发编程以及并发须知的几个概念:什么是线程安全?
  8. 唯一《可解释机器学习》中文书来了:复旦研究生翻译,原作者转发点赞
  9. php 原子性,PHP下O_APPEND模式的原子性
  10. linux中对shell变量内容的修改和替换
  11. 通用印刷体文字识别_印刷体文字识别(汉字)中文符的分割
  12. 串口通信接口标准(三)——RS232
  13. 为什么Redis 单线程却能支撑高并发?
  14. 2021那些值得推荐的社区小程序
  15. HTML 的js中手机号,身份证号等正则表达式表示
  16. 【vue2】子组件向父组件传参方法汇总
  17. Web前端:HTML+CSS+JS实现美女照片3D立方体旋转
  18. SpringBoot项目中增加favicon.ico图标
  19. mp3 文件格式介绍
  20. 速卖通教你如何提升店铺转化率——测评补单

热门文章

  1. 力扣题目——98. 验证二叉搜索树
  2. 代码主题darcula_Pycharm最舒服的主题风格
  3. 【Hive】动态分区插入
  4. linux配置MYSQL慢查询的一些错误解决方案
  5. selenium 无法启动IE浏览器的解决方法
  6. 通过手动抛自定义异常实现spring事务回滚
  7. informatica 常见问题及解决方案
  8. nginx 反向代理时丢失端口的解决方案(转)
  9. 第一次使用pyqt5解决的几个小问题
  10. scrapy爬虫返回302,301,解决方法