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

当前回答

单线解决方案:

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

其他回答

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

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]提供字符串。

用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 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False

非常易读,在许多情况下都可以使用,但有一个陷阱:

>>> 0 in {True, False}
True

但我们希望

>>> (0 is True) or (0 is False)
False

解决方案

前面表达式的一个概括是基于ytpilai的答案:

>>> any([0 is True, 0 is False])
False

可以写成

>>> any(0 is item for item in (True, False))
False

虽然此表达式返回正确的结果,但其可读性不如第一个表达式:-(

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

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

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

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