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 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
4

3 回答 3

2

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

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

于 2011-12-17T23:43:11.477 回答
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).

于 2011-12-17T23:56:02.150 回答
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
于 2011-12-18T00:22:53.837 回答