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

其他回答

也许您需要输出位集的直接公式。

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”:0xb 100“f”:0xb1 000

isc的关系(为“c”):

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

使用数学if公式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))

...

通过以下逻辑连接这些公式:

逻辑和是方程的平方和逻辑或是方程式的乘积

你会得到一个总方程式求和,你就有了求和的总公式

那么和1是c,和2是d,和4是e,和5是f

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

array[sum]提供字符串。

单线解决方案:

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

如果没有dict,请尝试以下解决方案:

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

并给出:

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

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

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

首先,对或有条件的:

你需要说:

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

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

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

最后一部分很好——例如,检查z==0,但前两部分基本上说了如果x和如果y。因为整数总是求值为True,除非它们为0,这意味着当x或y不等于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
        

同样,您可以使用LIST COMPRESENSION更快地获得相同的结果:

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
           ]