当前位置: 首页 > news >正文

【30天从零学Python】重要补充二:自定义排序

30天从零学Python

通信工程专业科班生,用了几十年MATLAB,为了过大厂机考,不得不自学Python。

文章目录

  • 30天从零学Python
  • 重要补充二:自定义排序
  • 0. 为什么要自定义排序?
  • 1. 基础回顾:sort () 方法的核心特性
  • 2、一维数组的自定义排序:吃透 key 与 lambda
    • 2.1 场景 1:对字符串列表按 “长度” 排序
    • 2.2 场景 2:对数字列表按 “绝对值” 排序
    • 2.3 场景 3:多规则排序(优先级排序)
  • 3. 二维数组的自定义排序:按指定列 / 维度排序
    • 3.1 场景 1:按某一列的值排序
    • 3.2 场景 2:多列组合排序
  • 4. 进阶:自定义函数替代 lambda(复杂场景)
  • 总结

重要补充二:自定义排序

由于做题过程中遇到很多重要但是细碎的知识点,专门开辟一个系列总结一下。
本集重点补充一下Python中自定义排序的方法。什么是自定义排序?就是对于一个二维或者多维数组按照某一个维度进行排序。Python中列表的sort()方法在这个方面非常强大,但是需要结合隐函数的定义来实现。本集重点介绍用Python的sort方法实现自定义排序。


0. 为什么要自定义排序?

Python 内置的 sort() 方法默认只能按 “自然顺序” 排序(数字升序、字符串字典序),但实际开发中,我们经常需要按自定义规则排序:

  • 对字符串按长度排序,而非字符顺序;
  • 对二维数组按某一列的值排序;
  • 对字典 / 对象按指定属性排序;

而实现这一切的核心,就是 sort() 方法的 key 参数 + 匿名函数(lambda)—— 这也是本文要重点拆解的内容。

1. 基础回顾:sort () 方法的核心特性

先明确三个基础点,避免新手踩坑:

  1. sort() 是列表的原地排序方法(直接修改原列表,返回值是None),区别于 sorted()(返回新列表);
  2. 核心参数:
  • key:接收一个函数,该函数的返回值作为 “排序依据”;
  • reverse:布尔值,是否反转排序结果(默认 False,升序);
  1. 排序是稳定的:若两个元素的 key 值相同,保持原列表中的相对顺序。

2、一维数组的自定义排序:吃透 key 与 lambda

2.1 场景 1:对字符串列表按 “长度” 排序

默认排序:按字符串字典序;自定义排序:按字符串长度升序 / 降序。

# 原始列表str_list=["apple","banana","pear","orange","grape"]# 默认排序:按照列表中每个字符串的字典序str_list.sort()print(str_list)# 输出:['apple', 'banana', 'grape', 'orange', 'pear']# 自定义规则:按字符串长度升序(短→长)str_list.sort(key=lambdax:len(x))print("按长度升序:",str_list)# 输出:['pear', 'apple', 'grape', 'banana', 'orange']# 自定义规则:按长度降序(长→短),结合reverse参数str_list.sort(key=lambdax:len(x),reverse=True)print("按长度降序:",str_list)# 输出:['banana', 'orange', 'apple', 'grape', 'pear']
  • 关键解析:
    • key=lambda x: len(x):lambda 函数接收列表中的每个元素 x,返回 len(x)(字符串长度)作为排序依据;
    • sort() 会根据 len(x) 的值对原列表元素排序,而非元素本身。

2.2 场景 2:对数字列表按 “绝对值” 排序

默认排序:按数字大小;自定义排序:按绝对值大小。

num_list=[-10,5,-3,8,-1]# 自定义规则:按绝对值升序num_list.sort(key=lambdax:abs(x))print("按绝对值升序:",num_list)# 输出:[-1, -3, 5, 8, -10]

2.3 场景 3:多规则排序(优先级排序)

若想 “先按长度排序,长度相同则按字典序”,只需让 lambda 返回元组(元组按元素依次比较):

str_list=["apple","pear","apricot","peach","grape"]# 自定义规则:先按长度升序,长度相同按字符串字典序str_list.sort(key=lambdax:(len(x),x))print("多规则排序:",str_list)# 输出:['pear', 'apple', 'grape', 'peach', 'apricot']

3. 二维数组的自定义排序:按指定列 / 维度排序

二维数组(列表的列表)是实际开发中高频场景(如表格数据、矩阵),核心是 “指定按哪一列排序”。

3.1 场景 1:按某一列的值排序

比如二维数组存储 “姓名 - 年龄 - 成绩”,要求按 “成绩降序” 排序:

# 二维数组:[姓名, 年龄, 成绩]stu_list=[["张三",18,90],["李四",19,85],["王五",18,95],["赵六",20,85]]# 自定义规则:按成绩降序(第3列,索引为2)stu_list.sort(key=lambdax:x[2],reverse=True)print("按成绩降序:")forstuinstu_list:print(stu)# 输出:# ['王五', 18, 95]# ['张三', 18, 90]# ['李四', 19, 85]# ['赵六', 20, 85]

3.2 场景 2:多列组合排序

要求 “先按年龄升序,年龄相同按成绩降序”:

stu_list.sort(key=lambdax:(x[1],-x[2]))# -x[2] 表示成绩降序(等价于reverse=True)print("按年龄升序+成绩降序:")forstuinstu_list:print(stu)# 输出:# ['王五', 18, 95]# ['张三', 18, 90]# ['李四', 19, 85]# ['赵六', 20, 85]

4. 进阶:自定义函数替代 lambda(复杂场景)

# 复杂规则:按字符串最后一个字符排序defget_last_char(s):returns[-1]# 返回最后一个字符作为排序依据str_list=["apple","banana","pear","orange"]str_list.sort(key=get_last_char)print("按最后一个字符排序:",str_list)# 输出:['banana', 'apple', 'orange', 'pear']

总结

key 参数接收一个函数,排序时,Python 会对列表中的每一个元素都执行一次这个函数,把函数的返回值作为该元素的 “排序权重 / 依据”,最终整个列表会按照这些 “权重值” 的大小(默认升序)来重新排列元素的顺序。
key 对应的函数 func 的输入参数,就是待排序列表中的每一个独立元素。

  1. 核心结论(敲重点)
    写 list.sort(key=func) 时:
  • Python 会自动遍历列表中的每一个元素(比如列表里的 x1, x2, x3…);
  • 依次把每个元素作为唯一的参数传入 func 中;
  • func 的返回值就是这个元素的 “排序依据值”;
  • 最终列表按这些 “依据值” 排序,输出原元素。
http://www.cnnetsun.cn/news/7838.html

相关文章:

  • 关于人工智能和就业的一线希望
  • 揭秘智能Agent在Docker中的编排难题:5大核心策略助你提升系统弹性
  • 记录:Spring异步执行的报异常No qualifying bean of type ‘org.springframework.core.task.TaskExecutor‘ available
  • 从零定义Agentic Apps:Docker Compose配置实战(附10个高可用场景案例)
  • 亲测3款降AI率工具!知网AI率从87%降到15%,免费降AI技巧+避坑测评全攻略
  • Kafka 的自动提交机制详解:Spring Boot 中如何正确使用?
  • PAT 1135 Is It A Red-Black Tree
  • YOLOv8-Ultralytics 系列文章目录
  • 自动化运维工程师之ansible启动rpcbind和nfs服务
  • 数字供应链系统哪个好?2025 供应链系统推荐排名来了,八大供应链系统
  • M.I.B.终极指南:解锁汽车娱乐系统的隐藏功能
  • 把 ABAP CDS 讲清楚:从 ABAP 7.40 SP05 的语义建模,到 SP08 的函数、参数化与扩展视图
  • 终极PHP兼容性检查工具:轻松应对版本迁移挑战
  • Kamailio usrloc 细节测试
  • 探索STM32单片机仿真温湿度采集控制系统
  • MediaPipe实时多模态感知:从单点检测到全身协同追踪的技术革命
  • SMDJ33A单向 TVS瞬态抑制二极管 :33V电压000W 浪涌,中压电路防护核心
  • MCP 2025量子编程认证重大升级(新增内容全曝光)
  • Bottles:让Windows软件在Linux上轻松运行的智能解决方案
  • 日志框架问答整理(吊打面试官)
  • 从零到安全工程师:2025年必备技能树详解(附实战学习蓝图)
  • Komikku:免费开源的Android漫画阅读器终极指南
  • 长耗时接口异步改造总结
  • 解码人类智慧密码——贾子五定律(Kucius Five Laws):贾子认知、历史、战略、军事、文明五定律
  • 启点创新智慧景区小程序系统,景区智能化售票系统,景区购票管理系统
  • 3种快速安装readr数据读取工具的方法:从入门到精通
  • 对比实测:传统vs自动化VMware安装,效率提升300%
  • 跨平台字体革命:PingFangSC字体包的终极解决方案
  • 14 类圣诞核心 SVG 交互方案拆解(附案例 + 资源)
  • 7个技巧轻松搞定Node.js版本升级:从16.x到20.x的无痛迁移指南