当前位置: 首页 > 知识库问答 >
问题:

结构模式匹配Python-匹配集合/冻结集合

毋宪
2023-03-14

我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过:

a = {1,2,3}

match a:
    case set(1,2,3):
        print('matched')

我尝试过:

a = {1,2,3}

match a:
    case set([1,2,3]):
        print('matched')

以及:

a = {1,2,3}

match a:
    case [1,2,3] if isinstance(a, set):
        print('matched')

我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢

共有2个答案

公孙巴英
2023-03-14

由于匹配构造不使用集合相等来比较集合,因此需要使用保护来显式执行此操作:

a = {1,2,3}

match a:
    case _ if a == set([1,2,3]): 
        print('matched')

默认情况下,不将集合与集合相等进行比较是不必要的。

邹弘
2023-03-14

这并不是结构模式匹配的真正用途;你匹配的模式更多的是价值而不是结构。因此,我认为您会发现等价的if形式更具可读性:

if a == {1, 2, 3}:
    print('matched')

话虽如此。。。

Python 3.10不支持匹配集的语法;它只有用于序列和映射的专用“显示”语法。我想我们曾短暂考虑过这一点,但最终放弃了它,因为它不是很有用或直观(而且很容易添加到更高版本中)。

幸运的是,可以使用限定(或“虚线”)名称通过相等匹配任何值。如果需要将集合作为较大模式的一部分进行匹配或匹配块,那么这可能是最好的方法:

class Constants:
    SET_123 = {1, 2, 3}

match a:
    case Constants.SET_123:
        print('matched')

如果您只想匹配集合(而不是,例如,frozensets),也可以将其与类模式结合使用:

match a:
    case set(Constants.SET_123):
        print('matched')
 类似资料:
  • 我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?

  • 字面量 变量 占位符

  • 我正在计算非负p的Lp距离函数。除了p=0和p=∞ 内置的pow()函数可以很好地发挥作用。在学习结构模式匹配之前,我使用了字典和异常处理: 有些人不希望这里有例外。因此,我将该片段改写为以下内容: 为什么大小写inf不正确(Python v3.10.2)?

  • 我有一个关于使用“永远”类型的穷举开关/情况的问题。 比如说,我有一组字符串:{a,B}(字符串可以是任意长的单词,而且集合本身可能非常大),对于每个子集(比如{},{a,B}),我想创建一个函数:show:Set= 预发伪代码: 是否有可能在编译时保证show函数中包含所有可能的子集?所以把C加到集合{A,B,C}需要我扩充show函数吗?并为{C}、{A,C}、{B,C}和{A,B,C}添加案

  • 我并不是在问regex模式,而是更多地问它的捕获组。我正在尝试将匹配项与正确的捕获组相关联。例如,字符串设置到匹配器组中: 那么假设您有字符串。它匹配捕获组、和。匹配器将匹配项放入、和。是否可以设置数组中的匹配以与捕获组相同的方式放置--以这样的顺序填充数组中的空元素?本质上,我想调用匹配器数组,它返回 如果匹配器找到了字符串的所有捕获组,则该操作有效,但如果字符串缺少任何内容,则不起作用。