如何对一个值进行多变量测试

python if-statement comparison match boolean-logic


我想做一个函数,将多个变量与整数进行比较,并输出一个由三个字母组成的字符串。我想知道有没有一种方法可以将其翻译成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"]

这样的事情有可能吗?




Answer 1 Martijn Pieters


你误解了布尔表达式的工作原理;它们的工作原理不像英文句子那样,猜想你在这里说的是所有的名字都是一样的比较。你要找的是。

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 的布尔测试,然后如果它为False,则测试表达式 y == 1

这是由于运算符的优先级。的 or 操作者具有较低的优先级比 == 测试,所以后者被评估第一

但是,即使不是这种情况,并且实际上将表达式 x or y or z == 1 解释为 (x or y or z) == 1 ,这仍然不能满足您的期望。

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

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

反之亦然。针对单个变量测试多个值; x == 1 or 2 or 3 会由于相同的原因而失败。 x in {1, 2, 3} 使用 x == 1 or x == 2 or x == 3 或x。




Answer 2 dansalmo


你的问题更容易用字典结构来解决,比如说:

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



Answer 3 ThatGuyRussell


正如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])



Answer 4 akaRem


x or y or z == 0 的直接方法是

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

但我不认为,你喜欢。)这条路很难看。

另一种方式(更好)是:

0 in (x, y, z)

顺便说一句, if 可以这样写

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break



Answer 5 ytpillai


如果你非常非常懒,你可以把值放在数组里面。比如说

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

你也可以把数字和字母放到字典里去做,但这可能比简单的if语句要复杂得多。这就是你想偷懒的结果:)

还有一件事,你的

if x or y or z == 0:

会编译,但不是以你希望的方式编译。当你简单地在if语句中放入一个变量时(例子)

if b

程序将检查该变量是否为空。上述语句的另一种写法(更有意义)是

if bool(b)

Bool是python中的一个内置函数,它基本上可以完成验证一个布尔语句的命令(如果你不知道那是什么,那就是你现在要在if语句中做的)。

我找到的另一个偷懒方法是:

if any([x==0, y==0, z==0])