如何按三个指定条件对Python字典列表进行正确排序
问题分析与修改方案
你现有代码存在两个核心错误导致无法得到预期结果:
- 布尔排序逻辑颠倒:Python中
True等价于1、False等价于0,默认升序排序时值更小的排在前面。你原逻辑中直接使用p["weight"]==75作为排序键,会让体重不等于75的条目得到更小的排序值,反而排在符合要求的条目前面,完全和需求相反。 - 缺失同优先级下的姓名排序规则:你期望身高差相同、体重条件、体重值都一致的条目按姓名升序排列,仅提前按姓名排序的写法无效——后续执行的排序会优先使用新的排序键,只有新键完全一致的条目才会保留之前的相对顺序,直接把姓名字段加入排序键元组更可靠。
修正后代码
def get_ordered_list(persons): persons.sort(key = lambda p: (abs(p["height"] - 180), p["weight"]!=75, p["weight"], p["name"])) return persons
排序键元组优先级从左到右依次降低:
- 第一优先级:
abs(p["height"] - 180)按和180的身高差升序排列,越接近180越靠前 - 第二优先级:
p["weight"]!=75体重等于75时该值为0,不等于75时为1,所以体重75的条目优先靠前 - 第三优先级:
p["weight"]按体重升序排列 - 第四优先级:
p["name"]前面三个条件都相同时,按姓名字典序升序排列
使用你给出的示例输入运行上述代码,输出结果和预期完全一致。
内容的提问来源于stack exchange,提问作者lucasbbs
相关产品推荐
相关产品推荐

