我想在 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)):
...
(我通过单元测试对每个(特殊)场合进行了准确的测试。)
但这并不是处理不必要代码的最佳方法。
那么我如何获得更干净的变体?
可以通过将输入集转换为规范元组形式来实现此目的,以便您可以使用固定值进行比较。
一种可能的规范形式将按字母顺序排序:
match sorted(set((string1, string2, string3))):
case (' Hello',' world', '!'):
...
case ('beatufiful', 'fair', 'nice'):
...
case ('extremly', 'hyper', 'strongly'):
...
(您的示例比较元组已经排序,但如果没有排序,您也必须对它们进行排序。)
你可以做的是通过摆脱
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"