You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:20:54