在Python中优化树

时间:2015-10-24 14:55:19

标签: python if-statement

我有一个“if decision tree”,我想知道是否可以优化它:

    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是第二个提出的功能 等等 在这里我有个人资料: profile all functions

3 个答案:

答案 0 :(得分:5)

通过比较元组来明确检查这些值,并在所有其他情况下返回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代码是否真的按你所说的那样)。当然,您可以在单元测试中始终使用这些不同的可能组合,以确保您的逻辑实际涵盖了所有这些。

答案 1 :(得分:2)

如果你知道你不会得到a = 3或b = -1,那么这就是一个oneliner:

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

答案 2 :(得分:0)

我更喜欢使用字典。

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的词典:

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