如何将含字母前缀数字键的字典按序导出为JSON
带字母前缀字符串键的字典按序导出JSON实现方案
问题场景
现有字典结构如下:
{ 'abc1': {'1': 'asdf', '11': 'asdfasd', "2": 'afds'}, 'abc2': {'1': 'asdf', '11': 'asdfasd', '2': 'afds'} }
需要将该字典导出为按键顺序排列的JSON,但因为键是带字母前缀的字符串(如abc1、abc2),内层键也是纯数字字符串(如'1'、'11'),直接用将键转为整数排序的方法行不通(如下示例的思路不适用):
import json d = dict({'2':'two', '11':'eleven'}) json.dumps({int(x):d[x] for x in d.keys()}, sort_keys=True)
核心实现思路
自定义排序规则,提取键中用于排序的有效部分,分层次处理嵌套字典的键:
1. 处理内层纯数字字符串键
这类键直接按字符串排序会出现'1' < '11' < '2'的错误顺序,解决方法是:
- 提取内层字典的键值对,将键转为整数后排序,再重新构建有序字典。
2. 处理外层带字母前缀的字符串键
需要分离键的字母前缀和数字后缀:
- 提取键中的字母部分(如
abc)和数字部分(如1),将数字部分转为整数; - 排序时先按字母前缀分组(如果前缀有差异),再按数字部分的数值大小排序;
- 如果所有外层键前缀一致,可直接提取数字部分转整数排序。
完整代码示例
import json from collections import OrderedDict def sort_nested_dict(d): sorted_items = [] for key, value in d.items(): # 递归处理内层嵌套字典 if isinstance(value, dict): # 内层键按数字值排序 sorted_inner = sorted(value.items(), key=lambda x: int(x[0])) sorted_value = OrderedDict(sorted_inner) else: sorted_value = value # 处理外层带前缀的键:分离字母和数字 prefix = ''.join([c for c in key if c.isalpha()]) num_str = ''.join([c for c in key if c.isdigit()]) # 生成排序用的键:(前缀, 数字值),确保先按前缀、再按数字排序 sort_key = (prefix, int(num_str)) if num_str else (key,) sorted_items.append((sort_key, key, sorted_value)) # 按自定义规则排序后构建有序字典 sorted_items.sort(key=lambda x: x[0]) return OrderedDict([(item[1], item[2]) for item in sorted_items]) # 原始字典 original_dict = { 'abc1': {'1': 'asdf', '11': 'asdfasd', "2": 'afds'}, 'abc2': {'1': 'asdf', '11': 'asdfasd', '2': 'afds'} } # 生成有序字典并导出格式化JSON sorted_dict = sort_nested_dict(original_dict) print(json.dumps(sorted_dict, indent=4))
代码说明
- 用
OrderedDict保证键的顺序(Python 3.7+普通字典也会保留插入顺序,OrderedDict兼容性更好); - 递归处理所有嵌套字典,确保内层数字字符串键也按数值排序;
- 外层键通过拆分前缀和数字,实现符合直觉的排序逻辑。
内容的提问来源于stack exchange,提问作者kruemel4
相关产品推荐
相关产品推荐

