组合条件语句排列的最佳方法

jpt*_*jpt 4 python conditional combinations if-statement

因此,基于4个条件变量,我要执行一系列操作-假设x,y,z和t。这些变量中的每一个都有可能的True或False值。因此,总共有16种可能的排列。而且我需要针对每个排列执行不同的操作。

什么是做到这一点的最佳方法,而不是进行庞大的if-else构造。

让我们看一个简化的例子。如果我尝试将所有不同的排列包含到一个大型的if-else结构中,这就是我的代码的样子。

if (x == True):
    if (y == True):
        if (z == True):
            if (t == True):
                print ("Case 1")
            else:
                print ("Case 2")
        else:
            if (t == True):
                print ("Case 3")
            else:
                print ("Case 4")
    else:
        if (z == True):
            if (t == True):
                print ("Case 5")
            else:
                print ("Case 6")
        else:
            if (t == True):
                print ("Case 7")
            else:
                print ("Case 8")
else:
    if (y == True):
        if (z == True):
            if (t == True):
                print ("Case 9")
            else:
                print ("Case 10")
        else:
            if (t == True):
                print ("Case 11")
            else:
                print ("Case 12")
    else:
        if (z == True):
            if (t == True):
                print ("Case 13")
            else:
                print ("Case 14")
        else:
            if (t == True):
                print ("Case 15")
            else:
                print ("Case 16")
Run Code Online (Sandbox Code Playgroud)

有什么办法可以简化吗?显然,对于每种情况,我的目标都比仅打印“案例1”更为复杂。

mun*_*unk 5

您可以使用案例映射到结果:

cases = { (True,  True,  True,  True):  "Case 1",
      (True,  True,  True,  False): "Case 2",
      (True,  True,  False, True): "Case 3",
      (True,  True,  False, False):"Case 4",
      (True,  False, True,  True): "Case 5",
      (True,  False, True,  False):"Case 6",
      (True,  False, False, True): "Case 7",
      (True,  False, False, False):"Case 8",
      (False, True,  True,  True): "Case 9",
      (False, True,  True,  False):"Case 10",
      (False, True,  False, True): "Case 11",
      (False, True,  False, False):"Case 12",
      (False, False, True,  True): "Case 13",
      (False, False, True,  False):"Case 14",
      (False, False, False, True): "Case 15",
      (False, False, False, False):"Case 16"}

print(cases[(x,y,z,t])
Run Code Online (Sandbox Code Playgroud)

如果您想针对每种情况执行其他操作/不同操作,则可以向该映射添加函数。

cases = { (True,  True,  True,  True):  foo_func,
      (True,  True,  True,  False): bar_func,
         ...}

result = cases[(x,y,x,t)](*args)
Run Code Online (Sandbox Code Playgroud)

您也可以使用一种掩蔽解决方案来缩短代码,或者如果您要写出的案例过多,但是对于较小的案例集,此显式表示将更清晰并且更易于维护。