缩短我的'和/或'使用括号的代码

时间:2017-06-14 23:39:17

标签: python

我想缩短这段代码:

if (a+b+c == 1000 and a**2 + b**2 == c**2) or (a+b+c == 1000 and a**2 + c**2 == b**2) or (a+b+c == 1000 and b**2 + c**2 == a**2)

成:

if a+b+c == 1000 and (a**2 + b**2 == c**2 or a**2 + c**2 == b**2 or b**2 + c**2 == a**2)

或更简单:

(A and B) or (A and C) or (A and D) <=> A and (B or C or D)

这合理吗?它似乎在我运行代码时起作用,但我不确定它是否正确。有没有更好的方法来缩短这个?

3 个答案:

答案 0 :(得分:0)

你是对的。

在数学符号中,以下等式将成立:

(A ∧ B) ∨ (A ∧ C) ∨ (A ∧ D) = A ∧ (B ∨ C ∨ D)

这通常称为CNF或DNF形式的标准化。

答案 1 :(得分:0)

布尔逻辑说它是等价的。 但更好的方法是测试驱动开发&#34; :首先编写所有可能结果的测试。然后针对您的第一个实现运行它们,然后针对您的重构实现。

更新,基于Cireo的回答:

import itertools
for a, b, c, d in itertools.product([True, False], repeat=4):
    print('%5s | %5s | %5s | %5s || %5s || %5s') % (a, b, c, d, (a and b) or (a and c) or (a and d), a and (b or c or d))

 True |  True |  True |  True ||  True ||  True
 True |  True |  True | False ||  True ||  True
 True |  True | False |  True ||  True ||  True
 True |  True | False | False ||  True ||  True
 True | False |  True |  True ||  True ||  True
 True | False |  True | False ||  True ||  True
 True | False | False |  True ||  True ||  True
 True | False | False | False || False || False
False |  True |  True |  True || False || False
False |  True |  True | False || False || False
False |  True | False |  True || False || False
False |  True | False | False || False || False
False | False |  True |  True || False || False
False | False |  True | False || False || False
False | False | False |  True || False || False
False | False | False | False || False || False

证明了这两个陈述对于所有变量的所有值都是等价的。

答案 2 :(得分:0)

是的!正如Uriel所提到的,这在数学上是合理的。此外,您已经注意到python中支持该表示法。下面的真值表显示它也按预期进行评估:

>>> for a, b, c in itertools.product([True, False], repeat=3):
...   print('%5s | %5s | %5s || %5s') % (a, b, c, (a or b or c))
... 
 True |  True |  True ||  True
 True |  True | False ||  True
 True | False |  True ||  True
 True | False | False ||  True
False |  True |  True ||  True
False |  True | False ||  True
False | False |  True ||  True
False | False | False || False