Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0119
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 配套视频
- 上次 我们 了解了列表的 嵌套(embedded)
- 列表项 也可以是 列表
- 可以 一直 嵌套下去
-
数字 不只是 简单的数字
- 在
结构中的数字
- 在
-
可以 在结构中
随机- 也可以 在结构中
排序吗?
- 也可以 在结构中
import random
lst = list(range(5))
print(lst)
random.shuffle(lst)
print(lst)
lst.sort()
print(lst)
- 传统 排序
- 构造列表
lst = [[1], [0]]
lst.sort()
lst
- 真的排了
- 咋排的呢??
Sequences compare lexicographically ...
- lexicographically 怎么理解?
- lexicographically
- /ˌleksɪkəˈɡræfɪkli/
- 字典序地
| 单词 | 中文 |
|---|---|
| lexicon | 词典 |
| lexical | 词汇的 |
| lexicology | 词汇学 |
| lexicography | 词典编纂 |
| lexicographer | 词典编纂者 |
| lexicographical | 字典序的 |
| lexicographically | 按字典序 |
- lexico - 词典编纂
| 部分 | 含义 | 作用 |
|---|---|---|
| lexico- | 词、词汇 | 词根 |
| -graph- | 写、记录 | 词根 |
| -y | 名词后缀 | 表行为/学科 |
| -ical | 形容词后缀 | ……的 |
| -ly | 副词后缀 | ……地 |
Sequences compare lexicographically using comparison of corresponding elements.
序列的比较 字典序地进行
即依次对比 两者对应位置的 元素
[1, 0, 1] < [1, 1, 0]
- 依次对比对应位置的元素
- 先比较 第0个列表项
- 相同
- 再比较 第1个列表项
- 不相同
- 先比较 第0个列表项
- 什么结构 都能排序 吗?
- lst 有两个列表项
- 数字0
- 列表[1]
lst = [0, [1]]
lst.sort()
- 能 排序 吗?
- 不能排序
- 排序的前提
- 得能 先 比大小
0 < [1]
- 报同样的错
列表型和整型- 不能 比大小
- 数值 很重要
- 整体数据
结构 - 数据所在
位置 更重要!!!
- 整体数据
- 数据结构 和 位置
- 比具体的 数值 更重要
- 结构不对
- 没有 比都没法比
- 更别说排序了
- 除了 list.sort方法 之外
- 还有 什么 排序方法?
- 内建函数 sorted
- 有什么
区别来着?🤔
- 有什么
- 不同之处
- list.sort 改原列表
- sorted 是 新建列表
- 具体怎么排序?
- 二维列表
- 姓名
- 数学
- 语文
student_list = [
["张三", 85, 92],
["李四", 98, 89],
["王五", 76, 88],
["赵六", 90, 95],
["钱七", 82, 78]
]
- 想 按照 数学排序
- 数学成绩
- 索引位置 为 1
shuxue = sorted(student_list, key=lambda x: x[1])
shuxue
- 排序的关键key
- 用的是 lambda
lambda x: x[1]
- 具体来说 什么是 lambda?
- lambda 是
- 没有名字的临时函数
- 匿名函数
lambda x: x[1]
- 适合像 排序key 这种
- 临时用一次的 简单逻辑场景
- 那 为什么叫做 lambda 呢?
- 1930 年代
- 由数学家阿隆佐・丘奇
- 提出的一套数学逻辑系统
- 核心是 “用匿名函数来表达计算逻辑”
- λ 演算
- Lambda Calculus
λ 演算里
-
$$\lambda x.\ 2x^2 + 3x - 5$$ - 本身就是公式
- 不用 函数名
彻底聚焦 “做什么” > > 而不是 “叫什么”
- 可以按照 语文成绩 排序吗?
- 参考因素 修改为
- 第2项 语文成绩
yuwen = sorted(student_list, key=lambda x: x[2])
yuwen
- 效果
- 可以从 高到低吗?
help(sorted)
- 查到参数
- 设置逆向
reverse=True
- 从高到低
- 比较的原则是
reverse=True
- 想按平均分排序
- 平均分 = (数学 + 语文) / 2
- key=lambda x: (x[1] + x[2])/2
average = sorted(student_list, key=lambda x: (x[1] + x[2])/2, reverse=True)
lambda x: (x[1] + x[2])/2
- 可以 有不同权重吗?
- 按照 权重排序
- 加权分 = 数学×0.6 + 语文×0.4
- key=lambda x: x[1]*0.6 + x[2]*0.4
average = sorted(student_list, key=lambda x: x[1]*0.6 + x[2]*0.4, reverse=True)
- 排序 的 核心 是 权重
- 今天的 生活
- 已经离不开
- 加权排序
- 购物
- 内容推荐
- 权重的配比 来自 lambda表达式
- 可以 按姓名 排序 吗?
pip install pypinyin pypinyin[stroke] # 安装拼音库+笔画扩展
- 先安装类库
student_list = [
["张三", 85, 92],
["李四", 98, 89],
["王五", 76, 88],
["赵六", 90, 95],
["钱七", 82, 78]
]
# 按姓名拼音精准排序
try:
from pypinyin import lazy_pinyin
print("===== 方法2:按姓名拼音精准升序排序 =====")
# 按姓名的拼音字符串排序
sorted_by_name_pinyin = sorted(student_list, key=lambda x: ''.join(lazy_pinyin(x[0])))
for student in sorted_by_name_pinyin:
name, math, chinese = student
print(f"姓名:{name},数学:{math},语文:{chinese}")
except ImportError:
print("⚠️ 未安装pypinyin库,无法执行拼音精准排序!请先执行:pip install pypinyin")
print("-" * 60)
- 这次的lambda表达式
- 调用了 lazy_pinyin函数
- 还 可以 怎么排序?
- 能 比大小
- 就能 排序
# 模拟短信数据:[内容, 发送时间]
messages = [
["【验证码】6897,5分钟内有效", "2026-03-06 10:00"], # 16字
["恭喜您获得XX平台优惠券,点击链接领取...(省略50字)", "2026-03-06 09:50"], # 60字
["您的银行卡尾号1234入账500元", "2026-03-06 09:40"], # 18字
["XX楼盘特价出售,首付20万起...(省略40字)", "2026-03-06 09:30"] # 50字
]
# 按短信内容长度升序(有效短短信在前)
sorted_messages = sorted(messages, key=lambda x: len(x[0]))
print("按短信长度排序(有效短信优先):")
for content, time in sorted_messages:
print(f"[{time}] {content[:20]}... ({len(content)}字)")
- 任务达成
- 这次我们 了解了 多维列表排序
- 默认是 直接比大小
-
可迭代对象students
- 对于students中的 每次迭代的x
- 可以按照 lambda表达式 排序
-
多维列表 的 赋值
- 有 什么
特点吗??🤔
- 有 什么
-
下次再说 👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。


















