python 比较匹配表达式中的集合

问题描述 投票:0回答:2

我想比较Python中匹配表达式中的集合。 因此,想象一下您想要比较多个变量,但没有任何顺序。它们只需包含作为整体的相同值。在这种情况下,如果您有多个组合需要测试以便准备就绪,则应该使用 match。可能如下所示:

match set((string1,string2,string3)):
    case set((' Hello',' world','!')):
        ...
    case set(('beatufiful','fair','nice')):
        ...
    case set(('extremly','hyper','strongly')):
        ...

但是这种方法不起作用,现在我担心我可能无法以这种方式比较集合。通过 '{'...','...'}' 表达式进行比较会出现语法错误。但是比较以下方法是有效的:

match 1:
    case 1 if set((' Hello',' world','!'))==set((string1,string2,string3)):
        ...
    case 1 if set(('beautiful','fair','nice'))==set((string1,string2,string3)):
        ...
    case 1 if set(('extremely','hyper','strongly'))==set((string1,string2,string3)):
        ...

(我通过单元测试对每个(特殊)场合进行了准确的测试) 但这并不是处理不必要的代码的最佳方法。

那么我如何获得更干净的变体?

python set match
2个回答
0
投票

你可以做的是通过摆脱

match 1 and case 1 if
来简化你的代码,你应该对集合本身进行匹配,加上每个案例中的 if 保护来比较集合,如下所示:

def categorize_strings(string1, string2, string3):
    s = {string1, string2, string3}
    match s:
        case s if s == {' Hello', ' world', '!'}:
            return "Greeting"
        case s if s == {'beautiful', 'fair', 'nice'}:
            return "Compliments"
        case s if s == {'extremely', 'hyper', 'strongly'}:
            return "Adverbs"
        case _:
            return "Unknown"

0
投票

可以通过将输入集转换为规范元组形式来实现此目的,以便您可以使用固定值进行比较。

一种可能的规范形式将按字母顺序排序:

match sorted(set((string1, string2, string3))):
    case set((' Hello',' world','!')):
        ...
    case set(('beatufiful', 'fair', 'nice')):
        ...
    case set(('extremly', 'hyper', 'strongly')):
        ...

(您的示例比较元组已经排序,但如果没有排序,您也必须对它们进行排序。)

© www.soinside.com 2019 - 2024. All rights reserved.