148序列类容器比较大小comparison
比较运算符
回忆
- 上次研究了
- 大于
- 小于
- 等于
-
不等于
-
单个字符 按照 序号比较

- 多个字符 组成 字符串 后
- 怎么 比较 呢???🤔
比较
"o1z" < "o2z"
"o" == "o"
"1" < "2"
- 第0个字符 相等
- 不分胜负
- 看 第1个

- 第1个 谁 大
- 谁 就 算 大

- 如果 第1个
也相等 呢?
第2个
- 从头开始
- 平局 继续 往后
"o1sy" < "o1z"
"o" == "o"
"1" == "1"
"s" < "z"
- 对应位置 依次 比下去

- 只要 不是 平局
- 就出 最终 结果

- 空串 怎么算呢?
没有对应
"o2z" > "o2"
"z" > ""
- 空 最小
- 比 任意字符 都小

- 从前往后
- 有大于无
- 空 是 非常特殊的
- 还记得吗?
先回忆
- 列表 就是序列类的容器
- 先喊 help()

- TRUTHVALUE 这个 topic
回顾

- 以下值 转化为 布尔类型 都为False
| 类别 | 具体内容 |
|---|---|
| 常量 | None、False |
| 数字 | 0、0.0、0j、Decimal(0) |
| 容器 | 空字符串 ''、空元组 ()、空列表 []、空字典 {}、空集合 set() |
真值的起源
- 从开关
- 到门电路
- 再到 逻辑真值

- 比较的结果 是 布尔类型的
- 字符串 比大小 有啥用啊?
管理员判断
username = "admin"
if username == "admin":
print("管理员登录")
else:
print("普通用户")
- 如果是管理员
- 就 输出

日期比较
# 原始:完全乱序,年份月份颠倒,看不出先后
war_events = {
"2024/04/13": "伊朗大规模向以色列发射弹道导弹与自杀无人机,跨区域远程打击",
"2022/02/24": "俄乌全面冲突爆发,大规模地面攻防+远程导弹打击开启",
"2019/06/20": "伊朗防空部队击落美军全球鹰高空无人侦察机,美伊局势急剧升温",
"2023/05/16": "乌克兰使用美援爱国者防空系统,拦截俄军高超音速匕首导弹",
"2020/01/03": "美军无人机空袭斩首伊朗名将苏莱曼尼,中东战争风险爆发",
"2024/09/01": "红海空域美制F-35战机与伊朗防空力量近距离空战博弈",
"2022/03/05": "北约援助防空导弹,俄乌多地爆发近距离空战对抗"
}
# YYYY/MM/DD 字符串直接排序,不用转日期
sorted_dates = sorted(war_events.keys())
print("=== 排序后标准时间线 ===")
for d in sorted_dates:
print(f"{d} → {war_events[d]}")
- 对字典排序的时候
- 没有指定 lambda
- 用的是 字典的 key排序
- 比较 日期字符串 的大小

- 除了 字符串之外
- 还有 什么序列类 容器 来着?
列表
- 一样的
- 从前向后 捉对厮杀
[0, 1, 2] > [0, 1, 3]
[0] == [0]
[0, 1] == [0, 1]
2 > 3
- 一旦 分出胜负
- 就是 最终结果

- 整体的口诀 还是
- 从前往后
- 有大于无

- 如果 容器嵌套 会如何呢?
问题
[1, 2, [3]] > [1, 2, 0]
- 这个TypeError怎么理解

帮助

- 前两轮
- 不分胜负

类型问题
- 最后一轮
- 比较的是 列表和整型
[3] > 0
- 系统 不支持 相应的比较

- 如果 就 想比较 嵌套列表
- 怎么办?
列表嵌套
[1, 2, [3]] > [1, 2, [0]]
- 前两轮相等

- 第三轮比较
- 回到了 列表比较
[3] > [0]
- 直接 比较 第0项
3 > 0
[3] > [0]
[1, 2, [3]] > [1, 2, [0]]
- 完成比较

- 帮助手册怎么说?
帮助手册
help()
- 进入帮助

- 查看比较运算符效果
COMPARISON
sequence
- lexicographically
- 字典序的

- 字符序列 用的也是 同样的逻辑

- 如果 列表 不一样长 呢?
原理
[1, 2, 0] > [1, 2]
[1, 2] == [1, 2]
- 前面不分胜负

- 继续
[0] > []
- 列表序列 有大于无

- 得到最后结论

- 就像 字符序列 有大于无
"z" > ""
- 无 是 最特殊的

嵌套
[1, [2], 3] < [1, [2, 3]]
[1] == [1]
[2] < [2, 3]
[] < [3]
- 第0项 不分胜负

- 第1项 比较中
- 第0项 不分胜负
- 第1轮 有大于无

- 如果前面 定了胜负 还看后面吗?
短路
[0, [5]] > [5, 0]
- 由于第0个元素 已经分出了胜负

- 后面 直接短路
- 比都不比
员工考核
staffs = [
[1, 82, 26, "李四"],
[0, 99, 30, "张三"], # 哪怕满分,标记0直接出局
[1, 95, 28, "王五"],
[1, 82, 29, "赵六"],
[0, 98, 27, "钱七"] # 同样一票否决
]
res = sorted(staffs, reverse=True)
print("=== 排序后最终考核名单 ===")
for s in res:
print(s)
- 从高到低

示意图

具体例子

- 在第0个人比较中
- 吕布vs武松
- 第0项属性 不分胜负
- 第1个属性 分出了胜负
# 两队武将列表,元素是(武力,智力)纯数字元组
sg_team = [
(98, 85), # 吕布
(97, 70), # 张飞
(95, 92) # 关羽
]
sh_team = [
(98, 60), # 武松
(95, 88), # 林冲
(93, 55) # 李逵
]
# 直接整体对比列表
if sg_team > sh_team:
print("三国武将军团 综合实力胜出")
else:
print("水浒武将军团 综合实力胜出")
- 可以排序吗?
排序

# 1. 三支军团:内部已按战力从强到弱排布
three_king = [
(99, 80), # 吕布
(97, 75), # 张飞
(96, 93) # 关羽
]
water_margin = [
(96, 65), # 武松
(95, 88), # 林冲
(93, 60) # 李逵
]
sui_tang = [
(100, 70), # 李元霸
(98, 82), # 宇文成都
(95, 78) # 裴元庆
]
# 2. 装进总队伍列表
all_army = [three_king, water_margin, sui_tang]
# 3. 整体降序排序:实力最强放前面
rank_result = sorted(all_army, reverse=True)
# 4. 对应名字方便看懂
name_map = {
str(three_king): "三国军团",
str(water_margin): "水浒军团",
str(sui_tang): "隋唐军团"
}
# 5. 打印最终排行
print("=== 三大军团 实力总排行 ===")
for idx, team in enumerate(rank_result, 1):
print(f"第{idx}名:{name_map[str(team)]} 战力阵容:{team}")
- 列表和元组之间可以比较吗?
列表和元组
(1, 2) == [1, 2, 3]
(1, 2) == [1, 2]
- 只能判断是否相等或不等
- 但是不能判断大于小于

- 手册怎么说?
手册
- 可以 比较 是否相等
- 但是 结果肯定是 False

- 因为 连 类型 都不相等
总结
- 这次 研究 序列类的 比较运算符
- 字符串 str
- 列表 list
- 元组 tuple
口诀还是
从前往后,有大于无
- 如果 序列 有 嵌套
- 需要比较时 进入子序列
- 再 进行比较
- 除了 列表之外
- 还有 啥
容器- 也可以比较吗?🤔
- 还有 啥
- 下次再说 👋

259

被折叠的 条评论
为什么被折叠?



