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

当前回答

正如这个答案所解释的那样,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])

其他回答

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]

在这里,集合是一个很好的方法,因为它命令变量,这似乎是你的目标。无论参数的顺序如何,{z,y,x}都是{0,1,3}。

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

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

要检查值是否包含在一组变量中,可以使用内置模块itertools和运算符。

例如:

进口:

from itertools import repeat
from operator import contains

声明变量:

x = 0
y = 1
z = 3

创建值映射(按要检查的顺序):

check_values = (0, 1, 3)

使用itertools允许重复变量:

check_vars = repeat((x, y, z))

最后,使用map函数创建迭代器:

checker = map(contains, check_vars, check_values)

然后,在检查值(按原始顺序)时,使用next():

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

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

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

not (x and y and z)

等效值:

not all((x, y, z))

这将帮助您。

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

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

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

并给出:

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