我想用布尔代数替代多个if语句。

0 投票
3 回答
560 浏览
提问于 2025-04-17 08:34

我想用布尔代数来代替多个条件判断,比如说

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)

撰写回答