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

其他回答

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

更普遍的方法是:

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

还有一种方法:

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 x == 1 or y == 1 or z == 1:

否则,x和y将单独计算(如果为0,则为False,否则为True)。

您可以对元组使用包含测试来缩短这一时间:

if 1 in (x, y, z):

或者更好:

if 1 in {x, y, z}:

使用集合来利用恒定成本成员资格测试(即,无论左手操作数是什么,都需要固定的时间)。

解释

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

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

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

x、y或z将计算为“truthy”的第一个参数,例如不是False、数字0或空(有关Python在布尔上下文中视为False的详细信息,请参见布尔表达式)。

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

反过来也一样;针对单个变量测试多个值;x==1或2或3将因相同原因而失败。在{1,2,3}中使用x==1或x==2或x==3或x。

单线解决方案:

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

Or:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]

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

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