Python 如何针对单个值测试多个变量?

Python 如何针对单个值测试多个变量?,python,if-statement,comparison,match,boolean-logic,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 =

我试图创建一个函数,将多个变量与一个整数进行比较,并输出一个由三个字母组成的字符串。我想知道是否有办法将其翻译成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"]

这样的事情可能吗?

您误解了布尔表达式的工作原理;它们不像一个英语句子,你猜这里所有名字的比较都是一样的。您正在寻找:

if x == 1 or y == 1 or z == 1:
x
y
单独进行评估(
False
if
0
True
否则)

您可以使用针对以下各项的安全壳测试来缩短该时间:

或者更好:

if 1 in {x, y, z}:
使用以利用恒定成本成员资格测试(即中的需要固定的时间量,无论左手操作数是什么)

解释 当您使用
时,python会将运算符的每一侧视为单独的表达式。表达式
x或y==1
首先被视为
x
的布尔测试,如果为False,则测试表达式
y==1

这是由于。
运算符的优先级低于
=
测试,因此先计算后者

然而,即使情况并非如此,表达式
x或y或z==1
实际上被解释为
(x或y或z)==1
,这仍然不会达到您期望的效果

x或y或z
将计算为第一个参数“truthy”,例如not
False
、数值0或空(有关Python在布尔上下文中认为False的内容的详细信息,请参阅)

因此对于
x=2的值;y=1;z=0
x或y或z
将解析为
2
,因为这是参数中的第一个类真值。然后
2==1
将是
False
,即使
y==1
将是
True


这同样适用于相反的情况;针对单个变量测试多个值
x==1或2或3将因同样的原因失败。使用
x==1或x==2或x==3
x在{1,2,3}

写入
x或y或z==0的直接方法是

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.
但是我不认为你喜欢它 这条路很难看

另一种方法(更好)是:

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

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

您的问题更容易通过以下字典结构解决:

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

要检查某个值是否包含在一组变量中,您可以使用内置模块
itertools
操作符

例如:

进口:

from itertools import repeat
from operator import contains
声明变量:

x = 0
y = 1
z = 3
check_vars = repeat((x, y, z))
values = {x, y, z}

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

if 1 in values:
    mylist.append("d")
创建值映射(按要检查的顺序):

使用
itertools
允许重复变量:

x = 0
y = 1
z = 3
check_vars = repeat((x, y, z))
values = {x, y, z}

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

if 1 in values:
    mylist.append("d")
最后,使用
map
函数创建迭代器:

checker = map(contains, check_vars, check_values)
然后,在检查值时(按原始顺序),使用
next()

等等

这比
lambda x:x in(变量)
更具优势,因为
操作符
是一个内置模块,比使用
lambda
创建自定义就地函数更快、更高效

检查列表中是否存在非零(或假)值的另一个选项:

not (x and y and z)
等价物:

not all((x, y, z))

我认为这将更好地处理它:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]
输出:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
In [21]: mylist                                                                                
Out[21]: ['c', 'd', 'f']

如果要使用If、else语句,以下是另一种解决方案:

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    elif l==1: myList.append('d')
    elif l==2: myList.append('e')
    elif l==3: myList.append('f')

print(myList)
mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]
x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]

如果您非常懒惰,可以将值放入数组中。比如

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语句中简单地放入一个变量时(示例)

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

Bool是python中的一个内置函数,它基本上执行验证布尔语句的命令(如果您不知道这是什么,那么这就是您现在试图在If语句中实现的:)

我发现的另一个懒惰的方法是:

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

在这里,Set是一种很好的方法,因为它对变量进行排序,这似乎是您的目标
{z,y,x}
{0,1,3}
无论参数的顺序如何

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

这样,整个解决方案就是O(n)。

此代码可能会有所帮助

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;

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

这里提供的所有优秀答案都集中于原始海报的具体要求,并集中于Martijn Pieters提出的
if 1 in{x,y,z}
解决方案。
他们忽略了问题的更广泛含义:
如何针对多个值测试一个变量?
如果使用字符串(例如:
测试字符串“Wild”是否包含多个值

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
... 
>>> 2 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False

对于这种情况,最容易转换为字符串

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True
然而,应该注意的是,正如
@codefrester
所述,使用此方法会丢失单词边界,如:

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True
3个字母
rot
确实以组合形式存在于列表中,但不是作为单个单词存在。测试“腐烂”会失败,但如果其中一个
mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]
mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
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
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")
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])
for value in [var1,var2,var3]:
     li.append("targetValue")
mydict = {0:"c", 1:"d", 2:"e", 3:"f"}
mylist= []

num_var = int(raw_input("How many variables? ")) #Enter 3 when asked for input.

for i in range(num_var): 
    ''' Enter 0 as first input, 1 as second input and 3 as third input.'''
    globals()['var'+str('i').zfill(3)] = int(raw_input("Enter an integer between 0 and 3 "))
    mylist += mydict[globals()['var'+str('i').zfill(3)]]

print mylist
>>> ['c', 'd', 'f']
x=0 or y=0 or z=0   is equivalent to x*y*z = 0

x=1 or y=1 or z=1   is equivalent to (x-1)*(y-1)*(z-1)=0

x=2 or y=2 or z=2   is equivalent to (x-2)*(y-2)*(z-2)=0
if xyz=0 then isc=1 else isc=0
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);
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']
x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]
['c', 'd', 'f']
>>> 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
>>> any([0 is True, 0 is False])
False
>>> any(0 is item for item in (True, False))
False
    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)
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")
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])
mappings = {0: "c", 1: "d", ...}
for v in (x, y, z):
    if v in mappings:
        mylist.append(mappings[v])