oeasy python148 序列类容器的比较运算_列表比较_元组比较_字符串比大小

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

口诀还是

从前往后,有大于无

  • 如果 序列 有 嵌套
  • 需要比较时 进入子序列
    • 再 进行比较
  • 除了 列表之外
    • 还有 啥 容器
      • 也可以比较吗?🤔
  • 下次再说 👋
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值