我有一个“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是第二个提出的功能 等等 在这里我有个人资料:
答案 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