如何以Pythonic方式将指定DataFrame字典转换为目标JSON格式?
优雅转换特定字典结构为目标JSON格式
问题背景
现有如下字典形式的DataFrame结构:
original_data = { 'bisac_code1': {2: {'BIO016000': 0.8, 'CKB041000': 0.30000000000000004}}, 'bisac_code2': {2: {'CKB049000': 0.3, 'BIO028000': 0.8}}, 'bisac_code3': {2: {'SPO058000': 0.8, 'CKB030000': 0.3}} }
需要将其转换为如下规范JSON结构(注:原目标示例存在语法瑕疵,已修正为合法JSON格式):
{ "bisac_code_1": [ {"code": "BIO016000", "weight": 0.8}, {"code": "CKB041000", "weight": 0.30000000000000004} ], "bisac_code_2": [ {"code": "CKB049000", "weight": 0.3}, {"code": "BIO028000", "weight": 0.8} ], "bisac_code_3": [ {"code": "SPO058000", "weight": 0.8}, {"code": "CKB030000", "weight": 0.3} ] }
此前通过循环加大量字符串格式化的非Pythonic方式实现,现寻求更优雅的实现方案。
Pythonic解决方案
可以结合字典推导式和列表推导式完成转换,代码简洁且可读性强:
import json original_data = { 'bisac_code1': {2: {'BIO016000': 0.8, 'CKB041000': 0.30000000000000004}}, 'bisac_code2': {2: {'CKB049000': 0.3, 'BIO028000': 0.8}}, 'bisac_code3': {2: {'SPO058000': 0.8, 'CKB030000': 0.3}} } # 核心转换逻辑 transformed_data = { # 调整键名格式:bisac_codeX → bisac_code_X key.replace('bisac_code', 'bisac_code_'): [ # 将内层键值对转为指定字典结构 {'code': code, 'weight': weight} for code, weight in value[2].items() ] for key, value in original_data.items() } # 生成格式化后的JSON字符串 json_result = json.dumps(transformed_data, indent=4) print(json_result)
代码说明
- 字典推导式:遍历原始数据的每个键值对,同时完成键名的格式修正。
- 列表推导式:针对每个键对应的内层字典(原始数据中固定以
2为键),批量转换为{"code": ..., "weight": ...}的字典结构,组成列表作为新键的值。 - json.dumps:将转换后的字典格式化为带缩进的JSON字符串,完全匹配目标格式要求。
内容的提问来源于stack exchange,提问作者Federico Vega
相关产品推荐
相关产品推荐

