如何测试多个变量是否等于单个值?

848 投票
31 回答
559198 浏览
提问于 2025-04-17 17:18

我想写一个函数,这个函数可以把多个变量和一个整数进行比较,然后输出一个由三个字母组成的字符串。我在想有没有办法把这个转换成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"]

31 个回答

78

正如Martijn Pieters所说,正确且最快的格式是:

if 1 in {x, y, z}:

按照他的建议,你现在会有独立的if语句,这样Python会读取每个语句,无论前面的结果是True还是False。比如:

if 0 in {x, y, z}:
    mylist.append("c")
if 1 in {x, y, z}:
    mylist.append("d")
if 2 in {x, y, z}:
    mylist.append("e")
...

这样做是可以的,但如果你对使用字典感到熟悉(你看,我在这里用了个小技巧),你可以通过先创建一个字典,把数字和你想要的字母对应起来,然后再用一个for循环来简化这个过程:

num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
    if number in {x, y, z}:
        mylist.append(num_to_letters[number])
119

你的问题可以通过使用字典这种结构更容易解决,比如:

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

你对布尔表达式的理解有些误区;它们的工作方式并不像英语句子那样,你可能以为这里所有的名字都在进行同样的比较。你应该这样写:

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

xy 会各自被单独判断(如果是 0 就是 False,其他情况就是 True)。

你可以用一个包含测试来简化这个过程,使用元组

if 1 in (x, y, z):

或者更好的是:

if 1 in {x, y, z}:

使用集合(set,这样可以利用固定时间的成员测试(也就是说,不管左边的值是什么,in的运行时间都是固定的)。

解释

当你使用 or 时,Python 会把运算符两边的部分看作是独立的表达式。表达式 x or y == 1 会先判断 x 的布尔值,如果 xFalse,再判断 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 == 1True

同样的道理也适用于反向情况;如果你把多个值和一个变量进行比较,x == 1 or 2 or 3 也会因为同样的原因失败。你应该使用 x == 1 or x == 2 or x == 3 或者 x in {1, 2, 3}

撰写回答