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 () 方法的核心特性
先明确三个基础点,避免新手踩坑:
- sort() 是列表的原地排序方法(直接修改原列表,返回值是None),区别于 sorted()(返回新列表);
- 核心参数:
- key:接收一个函数,该函数的返回值作为 “排序依据”;
- reverse:布尔值,是否反转排序结果(默认 False,升序);
- 排序是稳定的:若两个元素的 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 的输入参数,就是待排序列表中的每一个独立元素。
- 核心结论(敲重点)
写 list.sort(key=func) 时:
- Python 会自动遍历列表中的每一个元素(比如列表里的 x1, x2, x3…);
- 依次把每个元素作为唯一的参数传入 func 中;
- func 的返回值就是这个元素的 “排序依据值”;
- 最终列表按这些 “依据值” 排序,输出原元素。