如何针对单个值测试多个变量是否相等?

新手上路,请多包涵

我正在尝试制作一个将多个变量与整数进行比较并输出三个字母的字符串的函数。我想知道是否有办法将其翻译成 Python。所以说:

 x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0:
    mylist.append("c")
if x or y or z == 1:
    mylist.append("d")
if x or y or z == 2:
    mylist.append("e")
if x or y or z == 3:
    mylist.append("f")

这将返回一个列表:

 ["c", "d", "f"]

原文由 user1877442 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 488
2 个回答

您误解了布尔表达式的工作原理;它们不像英语句子那样工作,并猜测您在这里谈论的是所有名称的相同比较。您正在寻找:

 if x == 1 or y == 1 or z == 1:

x and y are otherwise evaluated on their own ( False if 0 , True otherwise).

您可以使用针对 tuple 的包含测试来缩短它:

 if 1 in (x, y, z):

或者更好:

 if 1 in {x, y, z}:

使用 set 来利用恒定成本成员资格测试(即 in 无论左侧操作数是什么都需要固定的时间)。

解释

当您使用 or 时,python 将运算符的每一侧视为 单独 的表达式。表达式 x or y == 1 首先被视为 x 的布尔测试,然后如果为 False,则测试表达式 y == 1

这是由于 运算符优先级or 运算符的优先级低于 == 测试,因此 评估后者。

但是,即使 不是 这种情况,并且表达式 x or y or z == 1 实际上被解释为 (x or y or z) == 1 相反,这仍然不会像您期望的那样做。

x or y or z 将评估为“真实”的第一个参数,例如不是 False ,数字 0 或空(有关 Python 在布尔上下文中认为错误的详细信息,请参见 布尔表达式)。

因此对于值 x = 2; y = 1; z = 0x or y or z 将解析为 2 ,因为这是参数中的第一个真值。那么 2 == 1 将是 False ,即使 y == 1 会是 True def4883bd913d—def48477d。

反过来也一样;针对单个变量测试多个值; x == 1 or 2 or 3 会因为同样的原因而失败。使用 x == 1 or x == 2 or x == 3x in {1, 2, 3}

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用字典结构可以更轻松地解决您的问题,例如:

 x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]

原文由 dansalmo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题