我想使用布尔代数,而不是使用几个if语句,

时间:2011-12-17 23:35:33

标签: python if-statement conditional boolean algebra

我想使用布尔代数而不是几个条件,例如

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

这里有一个简单的按位xor门

def(x,y): return x^y

3 个答案:

答案 0 :(得分:2)

你可以找到与你的条件产生相同值的正确表达式,但是这样的代码变得更难以阅读和维护。

更好的解决方案是使用嵌套列表或字典,您可以使用输入值进行索引。通过这种方式,您可以将代码转换为数据,这可以清晰,快速地表示您的映射,并且可以在将来轻松理解和轻松修改。

答案 1 :(得分: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)

答案 2 :(得分: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