news 2026/4/16 15:09:27

【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/4/5 19:49:28

Heimdall:三星设备刷机终极指南

Heimdall:三星设备刷机终极指南 【免费下载链接】Heimdall Heimdall is a cross-platform open-source tool suite used to flash firmware (aka ROMs) onto Samsung Galaxy devices. 项目地址: https://gitcode.com/gh_mirrors/hei/Heimdall 想要为你的三星…

作者头像 李华
网站建设 2026/4/16 0:15:36

Ventoy终极指南:打造万能启动盘,一劳永逸解决多系统启动难题

Ventoy终极指南:打造万能启动盘,一劳永逸解决多系统启动难题 【免费下载链接】Ventoy 一种新的可启动USB解决方案。 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy Ventoy是一款革命性的开源可启动USB解决方案,彻底改变了…

作者头像 李华
网站建设 2026/4/16 11:55:38

【紧急更新警告】:VSCode Cirq插件最新版本兼容性问题及修复方案

第一章:VSCode Cirq插件兼容性问题概述在量子计算开发环境中,Cirq 作为 Google 推出的开源框架,正被越来越多开发者用于构建和模拟量子电路。随着 VSCode 成为主流的轻量级代码编辑器,其对 Cirq 的支持也逐渐通过第三方插件实现。…

作者头像 李华
网站建设 2026/4/16 15:03:59

如何通过PlotNeuralNet和Overleaf在10分钟内创建专业神经网络示意图

如何通过PlotNeuralNet和Overleaf在10分钟内创建专业神经网络示意图 【免费下载链接】PlotNeuralNet Latex code for making neural networks diagrams 项目地址: https://gitcode.com/gh_mirrors/pl/PlotNeuralNet 你是否曾经为了论文中的神经网络结构图而烦恼&#xf…

作者头像 李华
网站建设 2026/4/16 15:04:10

fastapi双token机制登录实现

fastapi双token机制登录实现一、整体架构二、代码实现from datetime import datetime, timedelta, timezone import uuidfrom redis import asyncio from fastapi import HTTPException, Depends,FastAPI,Response,Request from fastapi.security import HTTPBearer, HTTPAutho…

作者头像 李华