Python 列表多条件排序实战:从基础到高级,一篇吃透

张开发
2026/5/3 20:45:47 15 分钟阅读

分享文章

Python 列表多条件排序实战:从基础到高级,一篇吃透
在 Python 开发中列表排序是高频操作简单的升序、降序很容易实现但多条件排序比如先按成绩降序成绩相同再按年龄升序先按部门排序部门相同再按薪资降序才是日常业务中最常用的场景。很多新手对多条件排序感到困惑其实 Python 提供了极简且高效的解决方案。本文将从基础语法讲起结合真实业务场景带你彻底掌握 Python 列表多条件排序代码可直接复制到项目中使用一、前置知识Python 排序的两个核心方法在讲多条件排序前先回顾 Python 列表排序的两个基础方法list.sort()原地排序直接修改原列表无返回值效率更高sorted()新建排序后的列表原列表保持不变适用于需要保留原始数据的场景。两个方法都支持 **key参数 **自定义排序规则和 **reverse参数 **控制升序 / 降序多条件排序的核心就是灵活使用key参数。基础用法示例python运行# 基础列表排序 nums [3, 1, 4, 2] # 原地升序 nums.sort() print(nums) # [1, 2, 3, 4] # 新建降序列表 new_nums sorted(nums, reverseTrue) print(new_nums) # [4, 3, 2, 1]二、多条件排序核心原理多条件排序的逻辑先按第一个条件排序第一个条件相同时再按第二个条件排序以此类推。实现关键给key参数传入一个元组元组内的元素就是排序的优先级条件元组顺序 排序优先级。格式python运行# sorted 方法 sorted(列表, keylambda x: (条件1, 条件2, 条件3...)) # list.sort 方法 列表.sort(keylambda x: (条件1, 条件2, 条件3...))升序直接写条件默认降序条件前加-仅适用于数字类型字符串 / 其他类型用reverse或自定义函数控制。三、场景 1数字类型列表多条件排序这是最基础的场景比如学生成绩排序需求先按总分降序总分相同按数学成绩降序数学成绩相同按学号升序。代码实现python运行# 学生数据[学号, 总分, 数学成绩] students [ [101, 580, 125], [103, 620, 130], [102, 580, 135], [105, 620, 128], [104, 550, 120] ] # 多条件排序总分降序 → 数学降序 → 学号升序 sorted_students sorted(students, keylambda x: (-x[1], -x[2], x[0])) # 打印结果 print(排序后的学生列表) for stu in sorted_students: print(stu)输出结果plaintext排序后的学生列表 [103, 620, 130] [105, 620, 128] [102, 580, 135] [101, 580, 125] [104, 550, 120]代码解析lambda x: (-x[1], -x[2], x[0])x代表列表中的每一个子元素-x[1]总分降序负号实现数字降序-x[2]总分相同时数学成绩降序x[0]前两个条件相同时学号升序。四、场景 2字典列表多条件排序最常用业务场景日常开发中我们更多处理字典列表比如接口返回数据、数据库查询结果多条件排序需求极高。示例员工数据排序需求先按部门升序部门相同按薪资降序薪资相同按入职年限升序。代码实现python运行# 员工字典列表 staff [ {name: 张三, dept: 技术部, salary: 15000, work_year: 3}, {name: 李四, dept: 产品部, salary: 18000, work_year: 5}, {name: 王五, dept: 技术部, salary: 18000, work_year: 2}, {name: 赵六, dept: 产品部, salary: 18000, work_year: 3}, {name: 钱七, dept: 技术部, salary: 15000, work_year: 1} ] # 多条件排序部门升序 → 薪资降序 → 入职年限升序 staff.sort(keylambda x: (x[dept], -x[salary], x[work_year])) # 格式化输出 print(排序后的员工列表) for s in staff: print(s)输出结果plaintext排序后的员工列表 {name: 李四, dept: 产品部, salary: 18000, work_year: 5} {name: 赵六, dept: 产品部, salary: 18000, work_year: 3} {name: 王五, dept: 技术部, salary: 18000, work_year: 2} {name: 张三, dept: 技术部, salary: 15000, work_year: 3} {name: 钱七, dept: 技术部, salary: 15000, work_year: 1}核心要点字典列表排序时key中直接通过键名取值即可逻辑和普通列表完全一致这是 Python 最优雅的地方五、场景 3字符串 数字混合多条件排序如果排序条件包含字符串无法用-实现降序该怎么办两种解决方案多个条件分开写结合reverse字符串降序用reverseTrue数字条件用-。示例商品排序需求先按分类升序分类相同按价格降序价格相同按商品名降序。代码实现python运行goods [ {name: 笔记本, category: 电子, price: 5999}, {name: 手机, category: 电子, price: 4999}, {name: 衬衫, category: 服饰, price: 199}, {name: 裤子, category: 服饰, price: 199} ] # 方案先按分类升序价格降序商品名降序 sorted_goods sorted(goods, keylambda x: (x[category], -x[price], x[name]), reverseFalse) # 解释字符串默认升序reverseFalse不影响数字的负号降序 print(排序后的商品列表) for g in sorted_goods: print(g)输出结果plaintext排序后的商品列表 {name: 裤子, category: 服饰, price: 199} {name: 衬衫, category: 服饰, price: 199} {name: 笔记本, category: 电子, price: 5999} {name: 手机, category: 电子, price: 4999}六、高级自定义函数作为 key复杂多条件排序当排序逻辑非常复杂比如条件需要计算、判断用lambda不够清晰时可以自定义函数作为key参数。示例学员综合排序需求先按是否及格排序及格在前不及格在后再按成绩降序最后按姓名升序。代码实现python运行def sort_rule(student): 自定义多条件排序规则 # 条件1及格(1)在前不及格(0)在后 is_pass 1 if student[score] 60 else 0 # 条件2成绩降序 score -student[score] # 条件3姓名升序 name student[name] # 返回排序元组优先级is_pass score name return (is_pass, score, name) # 学员数据 students [ {name: 小明, score: 59}, {name: 小红, score: 92}, {name: 小亮, score: 92}, {name: 小丽, score: 75} ] # 调用自定义函数排序 students.sort(keysort_rule) # 输出结果 print(自定义规则排序结果) for s in students: print(s)输出结果plaintext自定义规则排序结果 {name: 小红, score: 92} {name: 小亮, score: 92} {name: 小丽, score: 75} {name: 小明, score: 59}这种方式可读性极强适合复杂业务逻辑团队开发中推荐使用七、避坑指南多条件排序常见错误忘记用元组包裹条件❌ 错误keylambda x: x[1], -x[2]✅ 正确keylambda x: (x[1], -x[2])给字符串加负号❌ 错误keylambda x: -x[name]字符串不支持负号✅ 正确用reverseTrue或直接写条件混淆原地排序和新建列表list.sort()修改原列表无返回值sorted()返回新列表原列表不变。源码网https://svipm.com描述上千款各行各业的源码八、总结Python 列表多条件排序的核心就一句话通过key参数传入排序条件元组元组顺序 排序优先级数字用-实现降序复杂逻辑用自定义函数核心语法速记python运行# 通用模板 sorted(列表, keylambda x: (条件1, 条件2, 条件3)) 列表.sort(keylambda x: (条件1, 条件2, 条件3))本文覆盖了普通列表、字典列表、混合类型、自定义规则四大场景基本满足所有开发中的多条件排序需求建议收藏备用如果对你有帮助欢迎点赞、关注、转发后续会持续分享 Python 实战干货

更多文章