如何针对单个值测试多个变量的相等性?

daupos2t  于 2022-09-18  发布在  Java
关注(0)|答案(30)|浏览(180)

I'm trying to make a function that will compare multiple variables to an integer and output a string of three letters. I was wondering if there was a way to translate this into Python. So say:

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")

which would return a list of:

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

ljsrvy3e1#

用Python语言表示伪代码最典型的方式是:

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

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")
70gysomp

70gysomp2#


# selection

: a=np.array([0,1,3])                                                                                                                                                 

# options

: np.diag(['c','d','e','f']) 
array([['c', '', '', ''],
       ['', 'd', '', ''],
       ['', '', 'e', ''],
       ['', '', '', 'f']], dtype='<U1')

现在我们可以使用a作为[行,列]选择符,它的作用就像任何(...)条件:


# list of options[sel,sel]

: np.diag(['c','d','e','f'])[a,a]                                                                                                                                     

 array(['c', 'd', 'f'], dtype='<U1')
bvuwiixz

bvuwiixz3#

首先,更正OR条件:

您需要说:

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

原因是“or”将条件拆分成单独的逻辑部分。你最初陈述的方式,这些部分是:

x
y
z == 0   // or 1, 2, 3 depending on the if statement

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

为了避免这种情况,您需要确保条件的所有部分(OR的每一边)本身都有意义(可以通过假装OR语句的另一边不存在来做到这一点)。这样您就可以确认是否正确定义了OR条件。

您可以逐个编写语句,如下所示:

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

这意味着带有OR关键字的正确Mergin应该是:

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

第二,如何解决问题:

基本上,您希望检查是否有任何变量与给定的整数匹配,如果匹配,则在一对一Map中为其分配一个与其匹配的字母。您希望对特定的整数列表执行此操作,以便输出为字母列表。你会这样做:

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
           ]
cgvd09ve

cgvd09ve4#

不带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)
4uqofj5v

4uqofj5v5#

这里还有一种方法:

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")

它是列表理解任何关键字的混合。

7vux5j2d

7vux5j2d6#

问题

而测试多个值的模式

>>> 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

尽管此表达式返回正确的结果,但其可读性不如第一个表达式:-(

1u4esq0p

1u4esq0p7#

or不像explained by this answer那样工作。

而一般的答案将使用

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的顺序是任意的,则可以循环并将它们与Map进行匹配:

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

xghobddn8#

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

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)
7gyucuyw

7gyucuyw9#

你可以把这个统一起来

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']
gkn4icbw

gkn4icbw10#

这会对你有帮助。

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);
5m1hhzi4

5m1hhzi411#

在不使用DICT的情况下,尝试此解决方案:

x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]

并给予:

['c', 'd', 'f']
fnvucqvd

fnvucqvd12#

您可以使用字典:

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list
yhqotfr8

yhqotfr813#

看起来你在造某种凯撒密码。

一种更为普遍的方法是:

input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]

产出

['c', 'd', 'f']

我不确定这是否是代码所希望的副作用,但输出的顺序将始终是排序的。

如果这是您想要的,则可以将最后一行更改为:

sorted([chr(val + origo) for val in inputs])
vwkv1x7d

vwkv1x7d14#

使用一个值测试多个变量:if 1 in {a,b,c}:

使用一个变量测试多个值:if a in {1, 2, 3}:

brvekthn

brvekthn15#

它可以很容易地完成,因为

for value in [var1,var2,var3]:
     li.append("targetValue")

相关问题