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

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个回答

28

这段代码可能会有所帮助

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;

28
d = {0:'c', 1:'d', 2:'e', 3: 'f'}
x, y, z = (0, 1, 3)
print [v for (k,v) in d.items() if x==k or y==k or z==k]

17

您可以尝试下面显示的方法。在这种方法中,您将有自由指定/输入要输入的变量数。

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

12

一行解决方案:

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

10

用最具Python风格的方式在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")

2
这种方法比 if 2 in (x, y, z): mylist.append('e') 更通用,因为它允许任意的比较(例如,if any(v >= 42 for v in (x, y, z)):)。在 CPython3.6 中,所有三种方法的性能(2 in {x,y,z}2 in (x,y,z)any(_v == 2 for _v in (x,y,z)))似乎几乎相同(请参见 Gist)。 - imposeren

10
也许你需要直接的公式来输出设置的位。
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

让我们将其映射为比特:'c':1 'd':0xb10 'e':0xb100 'f':0xb1000

isc(是'c')的关系:

if xyz=0 then isc=1 else isc=0

使用数学公式,如果公式为 https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315

[c]: (xyz=0且isc=1) 或 (((xyz=0且isc=1) 或 (isc=0)) 且 (isc=0))

[d]: ((x-1)(y-1)(z-1)=0且isc=2) 或 (((xyz=0且isd=2) 或 (isc=0)) 且 (isc=0))

...

按照以下逻辑连接这些公式:

  • 逻辑and是方程的平方和
  • 逻辑or是方程的乘积

然后你会得到一个总方程,表达式为sum,你可以得到总和的公式

然后sum&1为c,sum&2为d,sum&4为e,sum&5为f

之后,您可以形成预定义数组,其中字符串元素的索引将对应于准备好的字符串。

array[sum]会给出相应的字符串。


8

这可以很容易地完成,如下所示:

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

7

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

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


5

看起来你正在构建某种凯撒密码。

更通用的方法如下:

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

4

您可以使用字典:

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

1
这可能会多次附加相同的内容。确定吗? - Sergei Krivonos

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