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

842

我想编写一个函数,将多个变量与整数进行比较,并输出三个字母的字符串。我想知道是否有办法将其转换为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"]

8
在元组中使用1 - user9011445
7
如果你想以任何/所有的方式评估一系列语句,可以使用any/all函数。 例如: all([1, 2, 3, 4, False]) 将返回 False all([True, 1, 2, 3]) 将返回 True any([False, 0, 0, False]) 将返回 False any([False, 0, True, False]) 将返回 True - eddd
11
这个问题是一个非常流行的重复目标,但我认为它不适合这个目的。大多数人尝试像 if x == 0 or 1: 这样做,当然类似于 if x or y == 0:,但对新手来说可能仍然有点困惑。考虑到 "为什么我的 'x == 0 or 1' 不起作用?" 这类问题的数量之多,我更愿意使用 这个问题 作为我们的标准重复目标。 - Aran-Fey
2
在与 00.0False 等“假值”进行比较时要特别小心。你很容易写出错误的代码,从而得到“正确”的答案。 - smci
显示剩余3条评论
31个回答

4
没有字典,可以尝试使用以下解决方案:
x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]

并提供:
['c', 'd', 'f']

3

这将有助于你。

def test_fun(val):
    x = 0
    y = 1
    z = 2
    myList = []
    if val in (x, y, z) and val == 0:
        myList.append("C")
    if val in (x, y, z) and val == 1:
        myList.append("D")
    if val in (x, y, z) and val == 2:
        myList.append("E")

test_fun(2);

3
or 不是这样工作的,正如这个答案所解释的那样。 通常的答案是使用
if 0 in (x, y, z):
    ...

这不是最适合这个“具体”问题的方法。在你的情况下,你正在进行“重复测试”,因此值得组成这些变量的“集合”。
values = {x, y, z}

if 0 in values:
    mylist.append("c")

if 1 in values:
    mylist.append("d")

我们可以使用字典来简化这个过程 - 这将得到相同的值:
mappings = {0: "c", 1: "d", ...}
for k in mappings:
    if k in values:
        mylist.append(mappings[k])

如果mylist的顺序是任意的,你可以循环遍历,然后将它们与映射匹配:

mappings = {0: "c", 1: "d", ...}
for v in (x, y, z):
    if v in mappings:
        mylist.append(mappings[v])

3

你可以通过两种方式来开发它

    def compareVariables(x,y,z):
        mylist = []
        if x==0 or y==0 or z==0:
            mylist.append('c')
        if  x==1 or y==1 or z==1:
            mylist.append('d')
        if  x==2 or y==2 or z==2:
            mylist.append('e')
        if  x==3 or y==3 or z==3:
            mylist.append('f')
        else:
            print("wrong input value!")
        print('first:',mylist)

        compareVariables(1, 3, 2)

或者

    def compareVariables(x,y,z):
        mylist = []
        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')
        if 3 in (x,y,z):
             mylist.append('f')
        else:
             print("wrong input value!")
        print('second:',mylist)

        compareVariables(1, 3, 2)

3

您可以将此合并

x = 0
y = 1
z = 3

在一个变量中。
In [1]: xyz = (0,1,3,) 
In [2]: mylist = []

将我们的条件更改为:

In [3]: if 0 in xyz: 
    ...:     mylist.append("c") 
    ...: if 1 in xyz: 
    ...:     mylist.append("d") 
    ...: if 2 in xyz: 
    ...:     mylist.append("e") 
    ...: if 3 in xyz:  
    ...:     mylist.append("f") 

输出:

In [21]: mylist                                                                                
Out[21]: ['c', 'd', 'f']

1

测试多个变量是否等于单个值:

将变量包装在一个集合对象中,例如 {a, b, c}。 使用 in 运算符测试该值是否存储在任何一个变量中。 如果该值至少存储在其中一个变量中,则 in 运算符将返回 True。

# ✅ test multiple variables against single value using tuple

if 'a' in (a, b, c):
    print('value is stored in at least one of the variables')

# ---------------------------------------------------------

# ✅ test multiple variables against single value using tuple

if 'a' in {a, b, c}:
    print('value is stored in at least one of the variables')

# ---------------------------------------------------------


# ✅ test multiple variables against single value (OR operator chaining)
if a == 'a' or b == 'a' or c == 'a':
    print('value is stored in at least one of the variables')

1

问题

在测试多个值的模式中

>>> 2 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False

非常易读,在许多情况下都能正常工作,但有一个陷阱:
>>> 0 in {True, False}
True

但是我们想要有
>>> (0 is True) or (0 is False)
False

解决方案

前面表达式的一个普遍化是基于ytpillai的答案:

>>> any([0 is True, 0 is False])
False

这可以写成:
>>> any(0 is item for item in (True, False))
False

尽管此表达式返回正确结果,但不如第一表达式易读 :-(

0

首先,对于 OR 条件语句的一个更正:

你需要这样说:

if x == 0 or y == 0 or z == 0:

原因是“或”将条件分成了单独的逻辑部分。按照您最初的陈述方式,这些部分是:
x
y
z == 0   // or 1, 2, 3 depending on the if statement

最后一部分没问题——例如检查z是否等于0——但前两部分基本上只是说if xif y。由于整数除非为0,否则始终计算为True,这意味着当xy不等于0时,您条件的第一部分始终为True(在y的情况下总是如此,因为您有y = 1,因为OR的工作方式),导致整个条件始终为True

为了避免这种情况,您需要确保条件的所有部分(OR的每个侧面)都可以独立地理解(您可以通过假装OR语句的另一侧面不存在来做到这一点)。这就是您可以确认您的OR条件是否正确定义的方法。

您可以像这样单独编写语句:

if x == 0
if y == 0
if z == 0

这意味着正确的合并方式是使用 OR 关键字:

if x == 0 or y == 0 or z == 0

第二,如何解决问题:
基本上,您想要检查任何变量是否与给定的整数匹配,如果是,就将其分配一个与之一一对应的字母。 您要对某个整数列表执行此操作,以便输出是字母列表。 你可以这样做:
def func(x, y, z):

    result = []

    for integer, letter in zip([0, 1, 2, 3], ['c', 'd', 'e', 'f']):
        if x == integer or y == integer or z == integer:
            result.append(letter)
            
    return result
        

同样地,您可以使用列表推导式来更快地实现相同的结果:
def func(x, y, z):

    return [ 
                letter 
                for integer, letter in zip([0, 1, 2, 3], ['c', 'd', 'e', 'f'])
                if x == integer or y == integer or z == integer
           ]
    
    

0

这里还有一种方法可以实现:

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

if any(i in [0] for i in[x,y,z]):
    mylist.append("c")
if any(i in [1] for i in[x,y,z]):
    mylist.append("d")
if any(i in [2] for i in[x,y,z]):
    mylist.append("e")
if any(i in [3] for i in[x,y,z]):
    mylist.append("f")

这是列表解析和 any 关键字的混合。


为什么要使用i in [0]而不是直接使用i == 0 - Tomerikoo
1
对于像这个问题中的单个比较,您可以使用“==”,但如果您想要多个变量的多个比较,则可以使用“in”运算符,例如:if any(i in [0,5,4,9,7] for i in[x,y,z])。 - Abhishek Kumar Saw

0

不使用if的示例:

x,y,z = 0,1,3
values = {0:"c",1:"d",2:"e",3:"f"} # => as if usage
my_list = [values[i] for i in (x,y,z)]

print(my_list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接