比较匹配表达式中的集合

问题描述 投票: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个回答
1
投票

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

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

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

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


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"
© www.soinside.com 2019 - 2024. All rights reserved.