国际访客建议访问 Primers 编程伙伴 国际版站点 > Python 教程 > 模式匹配 以获得更好的体验。

# Python 的容器模式匹配

使用模式匹配需要 Python 版本 \(\geq\) 3.10,参考 PEP 634

# 元组或列表的模式匹配

使用元组或列表形式的模式,可以匹配元组或列表:

运行示例

students:list[str] = ["Tom", "Jerry", "Spike"]              # 列表
match students:
    case (student1, student2):                              # 匹配两个元素的元组或列表
        print("有两名学生,分别是", student1, student2)
    case (_, _, _, _, *other):                              # 匹配四个以上元素的元组或列表
        print("有四名以上学生,分别是", students)
    case ("Tuffy", student1, student2):                     # 匹配三个元素且第一个元素是 Tuffy 的元组或列表
        print("Tuffy 后面的座位是", student1, student2)
    case (student1, student2, "Spike"):                     # 匹配三个元素且第三个元素是 Spike 的元组或列表
        print("Spike 前面的座位是", student1, student2)
    case _:
        print("BBQ")

模式既可以写成元组的形式,也可以写成列表的形式,甚至可写成序列形式(无括号)。
但无论写成哪种形式,模式都不区分元组和列表,既能匹配元组,也能匹配列表,。

如果需要进行区分,可以组合其它模式共同实现。

运行示例

students:list[str] = ("Tom", "Jerry", "Spike")              # 列表
match students:
    case tuple((student1, student2, student3)):             # 两层括号,外层为函数调用,内存为元组形式的模式
        print("三个元素的元组")
    case list((student1, student2, student3)):
        print("三个元素的列表") 
    case _:
        print("BBQ")

# 字典的模式匹配

使用字典形式的模式,可以匹配字典:

运行示例

score_list:dict[str,int] = {
    'Tom': 88,
    'Jerry': 99,
    'Spike': 66
}

match score_list:
    case {"Tuffy": score}:                                      # 匹配含有 Tuffy 键的字典
        print("Toffy 的成绩是", score)
    case {"Jerry": str(score)}:                                 # 匹配 Jerry 键对应的值类型为 str 的字典
        print("Toffy 的成绩是", score)
    case {"Tom": 88, "Jerry": score}:                           # 匹配 Tom 键对应的值为 77 且含有 Jerry 键的字典
        print("Tom 成绩 88 的那次考试,Jerry 的成绩是", score)
    case _:
        print("BBQ")

# 集合的模式匹配

集合 不能作为模式,仅能用空集来判断变量是不是集合,但使用 if 或者 isinstance 判断更加方便:

运行示例

students:set[str] = {"Tom", "Jerry", "Spike"}              # 集合
match students:
    case set():
        print("集合")
本文 更新于: 2025-06-19 01:15:25 创建于: 2025-06-19 01:15:25