news 2026/5/15 5:53:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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 的返回值就是这个元素的 “排序依据值”;
  • 最终列表按这些 “依据值” 排序,输出原元素。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 4:26:14

Vue虚拟滚动列表终极指南:告别大数据量卡顿的完整解决方案

Vue虚拟滚动列表终极指南:告别大数据量卡顿的完整解决方案 【免费下载链接】vue-virtual-scroll-list ⚡️A vue component support big amount data list with high render performance and efficient. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-virtual…

作者头像 李华
网站建设 2026/5/12 16:36:09

传统VS现代:乱码生成效率提升10倍的方法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个高效的乱码生成API服务,要求:1.支持RESTful接口 2.能处理高并发请求 3.提供多种乱码生成算法 4.有请求频率限制 5.返回JSON格式结果。使用Go语言开发…

作者头像 李华
网站建设 2026/5/14 13:20:56

PHP+OpenSSL实现银行级支付加密(实战代码+性能优化策略)

第一章:银行级支付加密的背景与PHP技术选型 在金融系统日益数字化的今天,支付安全成为银行与第三方支付平台的核心关注点。数据泄露、中间人攻击和身份伪造等风险促使企业必须采用银行级加密标准,如TLS 1.3、AES-256-GCM 和 RSA-OAEP&#xf…

作者头像 李华
网站建设 2026/5/10 9:24:44

Docker + AI模型版本管理实战(从入门到生产落地的7个阶段)

第一章:Docker 的 AI 模型版本管理方案在 AI 模型开发与部署过程中,模型版本的一致性、可复现性和环境隔离是关键挑战。Docker 提供了一种轻量级的容器化解决方案,通过将模型、依赖库、运行时环境打包为镜像,实现跨平台的一致性部…

作者头像 李华
网站建设 2026/5/14 22:46:32

Zephyr 的 Counter alarm

Zephyr 的 Counter 驱动支持“相对闹钟”和“绝对闹钟”两种触发语义。区别在于 struct counter_alarm_cfg 里的 flags 和 ticks 的含义。 关键结构体: struct counter_alarm_cfg {counter_alarm_callback_t callback; //回调uint32_t ticks; //不同模式下含义不同…

作者头像 李华