Python3如何按键正确排序嵌套字典(含键尾数字排序)
嵌套字典按「前缀+数字」自然排序的无第三方库实现
问题背景
你需要对嵌套字典的键进行排序,键的格式固定为xxx-数字,要求排序时既按前缀的字母顺序排列,又要把末尾的数字当作整数来比较(比如要得到abc-1、abc-2、abc-11的顺序,而不是字符串排序的abc-1、abc-11、abc-2),且不想依赖natsort这类第三方库。
解决方案
核心是自定义排序的key函数,把每个键拆分成「前缀字符串」和「整数数字」两部分,排序时先比较前缀,再比较数字大小。
1. 编写自定义排序key函数
def natural_sort_key(key): # 从最后一个'-'拆分,确保拿到正确的数字部分 prefix, num_str = key.rsplit('-', 1) # 返回排序依据:先比前缀(不区分大小写的话加.lower(),需要区分就去掉),再比数字 return (prefix.lower(), int(num_str))
2. 对嵌套字典进行排序
用这个key函数分别处理外层和内层字典的排序,用字典推导式可以简化代码:
# 假设你的嵌套字典是nested_dict sorted_dict = { outer_key: dict(sorted(inner_dict.items(), key=lambda x: natural_sort_key(x[0]))) for outer_key in sorted(nested_dict.keys(), key=natural_sort_key) }
3. 示例验证
比如输入以下嵌套字典:
nested_dict = { "def-10": {"abc-2": 2, "abc-11": 11}, "abc-1": {"def-1": 1, "def-2": 2}, "abc-11": {"abc-1": 1} }
排序后的结果会符合预期:
{ "abc-1": {"def-1": 1, "def-2": 2}, "abc-11": {"abc-1": 1}, "def-10": {"abc-2": 2, "abc-11": 11} }
注意事项
- 如果前缀中包含
-(比如格式是xxx-yyy-数字),rsplit('-', 1)依然能正确拆分出最后一段数字,比split('-', 1)更稳妥。 - 如果需要区分前缀的大小写,只需要把
prefix.lower()改成prefix即可。
内容的提问来源于stack exchange,提问作者user25681348
相关产品推荐
相关产品推荐

