Python如何实现字典列表按year升序+字母数字键多级排序
Python字典列表自定义多级排序实现方案
核心排序规则
- 第一优先级:按字典中
year键的数值做升序排列 - 第二优先级:按字典中
P+数字格式的键做自然排序,避免字符串排序下P10排在P9之前的问题
实现代码
# 原始待排序数据 raw_data = [ {"P9": 0, "year": 2023}, {"P13": 0, "year": 2023}, {"P10": 0, "year": 2023}, {"P11": 121200, "year": 2022}, {"P12": 0, "year": 2023}, ] def get_sort_key(item): # 第一排序维度:year升序 sort_level1 = item["year"] # 提取P开头的键,截取P后的数字转整数作为第二排序维度 p_key = next(key for key in item.keys() if key.startswith("P")) sort_level2 = int(p_key[1:]) # 返回元组作为排序键,Python会按元组元素顺序依次匹配优先级 return (sort_level1, sort_level2) # 执行排序 sorted_result = sorted(raw_data, key=get_sort_key)
结果验证
运行上述代码后,sorted_result的输出和预期完全一致:
[ {"P11": 121200, "year": 2022}, {"P9": 0, "year": 2023}, {"P10": 0, "year": 2023}, {"P12": 0, "year": 2023}, {"P13": 0, "year": 2023}, ]
关键说明
- 为什么转整数能解决自然排序问题:字符串排序是逐字符对比ASCII值,对比
"P10"和"P9"时,第二位字符'1'的ASCII码小于'9',就会出现P10排在P9前的反直觉结果;把P后的数字转成整数后,排序会直接按照数字实际大小对比,符合日常认知的排序逻辑。 - 代码中用
next()提取P开头的键,适配当前每个字典有且仅有一个P+数字格式键的场景,如果后续数据结构变化存在多个P开头键,可以按需调整键的提取逻辑。 - Python内置
sorted函数默认升序排列,不需要额外加reverse参数,正好匹配需求。
内容的提问来源于stack exchange,提问作者Storyfoyo
相关产品推荐
相关产品推荐

