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

其他回答

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

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语句中时(示例)

if b

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

if bool(b)

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

我发现的另一种懒惰方式是:

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

正如这个答案所解释的那样,or并不是那样工作的。

而通用答案将被使用

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的顺序是任意的,则可以循环这些值,并将它们与映射匹配:

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

这将帮助您。

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);
#selection
: a=np.array([0,1,3])                                                                                                                                                 

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

现在我们可以使用as[row,col]选择器,它的作用就像任何(…)条件一样:

#list of options[sel,sel]
: np.diag(['c','d','e','f'])[a,a]                                                                                                                                     

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

你可以团结起来

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