Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中优化if树_Python_If Statement - Fatal编程技术网

在Python中优化if树

在Python中优化if树,python,if-statement,Python,If Statement,我有一个“如果决策树”,我想知道是否有可能优化它: def s(a, b): """ :param a: 0,1,2 :param b: 0,1,2 :return: 0,1,2 """ if a == 0: if b == 0: return 2 elif b == 1: return 2 else: # b == 2

我有一个“如果决策树”,我想知道是否有可能优化它:

    def s(a, b):
    """
    :param a: 0,1,2
    :param b: 0,1,2
    :return: 0,1,2
    """
    if a == 0:
        if b == 0:
            return 2
        elif b == 1:
            return 2
        else:  # b == 2
            return 0
    elif a == 1:
        if b == 0:
            return 2
        elif b == 1:
            return 2
        else:  # b == 2
            return 1
    else:  # a==2
        if b == 0:
            return 0
        elif b == 1:
            return 1
        else:  # b==2
            return 2
包括所有案例,我正在尝试使用(a,b)=(1,2)或(a,b)=(2,1)返回1 返回0时也是如此。其他情况返回2,但速度较慢

编辑: 我已经测试了(时间和有效期(全部有效))所有提议的“ifs”,并且: s是我的显式函数 ss是第一个被提出的函数 sss是第二个建议的功能 等 这里我有个人资料:

只需通过比较元组明确检查这些值,并在所有其他情况下返回
2

v = (a, b)
if v == (1, 2) or v == (2, 1):
    return 1
elif v == (0, 2) or v == (2, 0):
    return 0
else:
    return 2
你甚至可以更进一步,想想你的支票是做什么的:如果其中任何一个数字是2,你就返回另一个数字

if a == 2:
    return b
elif b == 2:
    return a
else:
    return 2

通常,您也可以创建一个精确的映射,例如使用字典,它允许您直接查找结果(而不是使用复杂的if/else结构)。但是当你确定结果的逻辑真的适合一个句子时,那么你应该真正尝试以一种保持简洁逻辑完好无损的方式来实现它。否则,将很难发现错误(例如,我花了一段时间来验证if/else代码是否真的执行了您所说的操作)。当然,您可以在单元测试中始终使用这些不同的可能组合,以确保您的逻辑实际上涵盖了所有内容。

如果您知道您不会得到a=3或b=-1,那么这里有一条直线:

def new_s(a,b):
    return min(a,b) if max(a,b) == 2 else 2

我更喜欢用字典

mydict[0][0] = 2
mydict[0][1] = 2
mydict[0][2] = 0
mydict[1][0] = 2
mydict[1][1] = 2
mydict[1][2] = 1
mydict[2][0] = 0
mydict[2][1] = 1
mydict[2][2] = 2

print mydict[a][b]
如何创建dict of dict:

mydict = dict()
mydict[0] = dict()
mydict[0][1] = 2

是的,可以进行优化。您可以使用
进行优化,但如果您担心优化if语句,您通常会考虑过度optimization@cricket_007我不同意。如果逻辑真的像OP在最后一句中写的那样简单,那么您应该能够准确地表示该逻辑。写出所有可能的案例并不是理解逻辑的好方法。而且它很容易出错,因为我需要多次查看以验证这些案例是否都是正确的。我这样写只是因为我需要检查是否所有的可能性都返回有效值。然后决定询问堆栈社区:)。如何制作两个整数键字典?这是口授的口授吗?我使用元组键,但我不确定这是否合适是的,这是dict of dict。在代码中添加了一个示例。@贝霍斯顿你也可以使用元组键,这很好。这是最慢的函数如果你从速度的角度谈论优化,那么你最好用numpy,Cython,第二个函数比显式的all if语句快一点