如何测试多个变量是否等于单个值?
我想写一个函数,这个函数可以把多个变量和一个整数进行比较,然后输出一个由三个字母组成的字符串。我在想有没有办法把这个转换成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 个回答
正如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])
你的问题可以通过使用字典这种结构更容易解决,比如:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
你对布尔表达式的理解有些误区;它们的工作方式并不像英语句子那样,你可能以为这里所有的名字都在进行同样的比较。你应该这样写:
if x == 1 or y == 1 or z == 1:
x
和 y
会各自被单独判断(如果是 0
就是 False
,其他情况就是 True
)。
你可以用一个包含测试来简化这个过程,使用元组:
if 1 in (x, y, z):
或者更好的是:
if 1 in {x, y, z}:
使用集合(set
),这样可以利用固定时间的成员测试(也就是说,不管左边的值是什么,in
的运行时间都是固定的)。
解释
当你使用 or
时,Python 会把运算符两边的部分看作是独立的表达式。表达式 x or y == 1
会先判断 x
的布尔值,如果 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 = 0
,x or y or z
会得到 2
,因为这是参数中第一个“真实”的值。然后 2 == 1
会是 False
,尽管 y == 1
是 True
。
同样的道理也适用于反向情况;如果你把多个值和一个变量进行比较,x == 1 or 2 or 3
也会因为同样的原因失败。你应该使用 x == 1 or x == 2 or x == 3
或者 x in {1, 2, 3}
。