我想用布尔代数替代多个if语句。
我想用布尔代数来代替多个条件判断,比如说
def boo(x,y):
if x==3 and y==1: return 4
if x==3 and y==4: return 1
if x==4 and y==1: return 2
if x==4 and y==2: return 1
if x==5 and y==1: return 3
我想做的是
def simple(x,y):
return x#y
总共有12个方程,我只想直接返回 (x#y),其中#是一个布尔运算符。我之前在一个小问题上做过类似的事情,幸运的是找到了一个关系。我想在这个情况下也这样做,我该怎么进行呢?
这样做会不会提高性能,因为它不需要经过多个if条件判断?这样做算不算正常的做法?
示例:
x y output
1 2 3
1 3 2
1 4 5
1 5 4
这里一个简单的按位异或门就可以解决
def(x,y): return x^y
3 个回答
0
你可以考虑使用字典。你可以创建一个字典的字典,也就是说在一个字典里面再放一个字典,然后让你的函数通过这个字典来获取值。
def boo(x,y):
if x==3 and y==1: return 4
if x==3 and y==4: return 1
if x==4 and y==1: return 2
if x==4 and y==2: return 1
if x==5 and y==1: return 3
def boodict(x,y):
d1 = {3: {1:4, 4:1} ,4: {1:2, 2:1},5: {1:3}}
try:
value = d1[x][y]
except KeyError:
value = None
return value
2
你可以找到一个合适的表达式,让它的结果和你的条件判断一样,但这样写的代码会变得难以阅读和维护。
更好的办法是使用嵌套的列表或字典,这样你可以用输入的值来查找。这种方式把代码变成了数据,这样就能清晰快速地表示你的映射关系,而且将来也容易理解和修改。
1
我不太确定如果把上面的逻辑用更简洁的方式表达出来,是否会让代码更容易理解;可能不会。不过你可以把这个逻辑重新整理成一种更数学化的形式:
def boo(x, y):
p = (x, y)
return (1 if p in ((3, 4), (4, 2)) else
2 if p == (4, 1) else
3 if p == (5, 1) else
4 if p == (3, 1) else
None)
另一种选择是使用字典:
def boo(x, y):
return {(3,4):1, (4,2):1, (4,1):2, (5,1):3, (3,1):4}.get((x, y), None)
如果你确定所有的值都会符合指定的情况,你可以用 [(x, y)]
来代替 .get((x, y), None)
。