【问题标题】:Is it possible in Python to write a sort of truth table to simplify the writing of if statements?是否可以在 Python 中编写一种真值表来简化 if 语句的编写?
【发布时间】:2023-03-22 00:11:01
【问题描述】:

假设我正在尝试使用它的加速度计打印出平板设备的方向,该加速度计提供设备显示屏水平和垂直方向的加速度测量值。我知道这样的打印输出可以使用一组if 语句来完成,格式如下:

if abs(stableAcceleration[0]) > abs(stableAcceleration[1]) and stableAcceleration[0] > 0:
    print("right")
elif abs(stableAcceleration[0]) > abs(stableAcceleration[1]) and stableAcceleration[0] < 0:
    print("left")
elif abs(stableAcceleration[0]) < abs(stableAcceleration[1]) and stableAcceleration[1] > 0:
    print("inverted")
elif abs(stableAcceleration[0]) < abs(stableAcceleration[1]) and stableAcceleration[1] < 0:
    print("normal")

是否有可能以更简洁的形式将其逻辑编码?是否可以构建一种真值表,使得方向只是该表的查找值?做这种事情的好方法是什么?


编辑:在@jonrsharpe 的a suggestion 之后,我以如下方式实现了逻辑:

tableOrientations = {
    (True,  True):  "right",
    (True,  False): "left",
    (False, True):  "inverted",
    (False, False): "normal"
}
print(
    tableOrientations[(
        abs(stableAcceleration[0]) > abs(stableAcceleration[1]),
        stableAcceleration[0] > 0
    )]
)

【问题讨论】:

  • 您缺少abs(stableAcceleration[0]) == abs(stableAcceleration[1])stableAcceleration[0] == 0 的案例。但我建议只为 stableAcceleration[0]stableAcceleration[1] 定义两个较短的名称,其余的保持原样。
  • 您可以有一个字典,其中键是布尔元组(例如(True, False))或整数(例如(-1, 0)),值是适当的字符串(例如'right')。
  • 在你的情况下这可能是极端的过度工程,但我有一个类似的问题,非常复杂的 if 语句详细说明了许多不同的规则,我通过使用 scikit-learn 工具包创建决策树来解决它。
  • @tobias_k 感谢您的评论。你提到的情况,我认为只是不采取行动的情况。
  • @jonrsharpe 谢谢你的建议。我想我会采用你的方法。字典中布尔元组的组合接近于真值表的概念。

标签: python if-statement logic truthtable


【解决方案1】:

考虑按照以下方式做一些事情:

x = 0;
if abs(stableAcceleration[0]) > abs(stableAcceleration[1]) :
    x += 2
if stableAcceleration[0] > 0:
    x +=1

list = ["normal", "invert", "left", "right"]

print(list[x])

话虽如此,您的一系列if 声明并未涵盖所有情况。

【讨论】:

  • 这会以不同的方式处理== 的情况。 OP 似乎只是忽略了这些。
  • 感谢您的巧妙解决方案。对于每个条件,您都可以更改更接近答案的索引。
  • @tobias_k 我们可以将每件事再增加 1 并再添加一个检查。然后有list = ["", "normal", "invert", "left", "right"]。然后它不会为所有剩余的情况打印任何内容。
猜你喜欢
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2019-04-16
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多