我想比较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 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"
可以通过将输入集转换为规范元组形式来实现此目的,以便您可以使用固定值进行比较。
一种可能的规范形式将按字母顺序排序:
match sorted(set((string1, string2, string3))):
case set((' Hello',' world','!')):
...
case set(('beatufiful', 'fair', 'nice')):
...
case set(('extremly', 'hyper', 'strongly')):
...
(您的示例比较元组已经排序,但如果没有排序,您也必须对它们进行排序。)