Skip to content

Latest commit

 

History

History
450 lines (309 loc) · 8.63 KB

File metadata and controls

450 lines (309 loc) · 8.63 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0146
- 这是 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` 
---

比较运算符

回忆

  • 上次研究了
    • 大于
    • 小于
    • 等于
    • 不等于

图片描述

  • 多个字符 的 字符串 如何比较 呢???🤔

比较

"o1z" < "o2z"
"o" == "o"
"1" < "2"
  • 第一个字符 相等
    • 看 第二个

图片描述

  • 第二个谁大 就是 整体大

图片描述

  • 如果第二个也相等呢?

第三个

"o1sy" < "o1z"
"o1" == "o1"
"s" < "z"
  • 依次对应位置 比下去
    • 从前往后 挨个比

图片描述

  • 只要 不是 平局
    • 就出结果

图片描述

  • 空串 怎么比呢?

没有对应

"o2z" > "o2"
"z" > ""
  • 空串 最小
    • 比任意字符 都小

图片描述

  • 从前往后 有大于无
    • 这就是 帮助里说的
    • 按照字典序比较
    • lexicographically

图片描述

  • 比较字符串的大小 有什么用呢?

管理员判断

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排序
    • 比较 日期字符串 的大小

图片描述

  • 除了 字符串之外
    • 还有 什么序列类 容器?

先回忆

  • 列表 就是序列类的容器
    • 先喊 help()

图片描述

  • TRUTHVALUE 这个 topic

回顾

图片描述

  • 以下值 转化为 布尔类型 都为False
类别 具体内容
常量 None、False
数字 0、0.0、0j、Decimal(0)
容器 空字符串 ''、空元组 ()、空列表 []、空字典 {}、空集合 set()

真值的起源

  • 从开关
    • 到门电路
    • 再到 逻辑真值

图片描述

  • 比较的结果 是 布尔类型的

列表

[0, 1, 2] > [0, 1, 3]
[0, 1] == [0, 1]
2 > 3
  • 一样的
    • 从前向后 捉对厮杀
    • 分出胜负 就是 最终胜负

图片描述

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

图片描述

员工考核

图片描述

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)
  • 从高到低

图片描述

问题

[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]]
  • 完成比较

图片描述

  • 帮助手册怎么说?

帮助手册

图片描述

sequence

  • /sequence
    • lexicographically
    • 字典序的

图片描述

  • 如果列表不一样长呢?

原理

[1, 2, 0] > [1, 2]
  • 前面不分胜负

图片描述

  • 有后续的 定胜负

嵌套

[1, [2], 3] < [1, [2, 3]]
  • 第0项 不分胜负

图片描述

  • 第1项 比较中
    • 第0项 不分胜负
    • 第1轮 有后续的胜出

图片描述

  • 如果前面 定了胜负 还看后面吗?

短路

[0, [5]] > [5, 0]
  • 由于第0个元素 已经分出了胜负

图片描述

  • 后面 直接短路
    • 比都不比

具体例子

图片描述

  • 在第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
    • 字节序列 bytes
    • 列表 list
    • 元组 tuple

整体的口诀还是

从前往后,有大于无

  • 如果有嵌套的列表之类的东西
    • 就比较这两个列表
    • 如果此子列表中还有列表
    • 就继续比较下去
    • 直到分出大小
  • 除了列表之外还有什么容器呢?🤔
  • 下次再说 👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。