如何针对单个值测试多个变量?

8fsztsew  于 2021-09-29  发布在  Java
关注(0)|答案(27)|浏览(410)

我试图创建一个函数,将多个变量与一个整数进行比较,并输出一个由三个字母组成的字符串。我想知道是否有办法将其翻译成python。那么说:

  1. x = 0
  2. y = 1
  3. z = 3
  4. mylist = []
  5. if x or y or z == 0 :
  6. mylist.append("c")
  7. if x or y or z == 1 :
  8. mylist.append("d")
  9. if x or y or z == 2 :
  10. mylist.append("e")
  11. if x or y or z == 3 :
  12. mylist.append("f")

将返回以下内容的列表:

  1. ["c", "d", "f"]

这样的事情可能吗?

pinkon5k

pinkon5k1#

这里还有一种方法:

  1. x = 0
  2. y = 1
  3. z = 3
  4. mylist = []
  5. if any(i in [0] for i in[x,y,z]):
  6. mylist.append("c")
  7. if any(i in [1] for i in[x,y,z]):
  8. mylist.append("d")
  9. if any(i in [2] for i in[x,y,z]):
  10. mylist.append("e")
  11. if any(i in [3] for i in[x,y,z]):
  12. mylist.append("f")

它是列表理解和任何关键字的混合。

6tr1vspr

6tr1vspr2#

这个 or 正如这个答案所解释的,它不是那样工作的。
而一般的答案是使用

  1. if 0 in (x, y, z):
  2. ...

这不是针对具体问题的最佳方案。在您的情况下,您正在进行重复测试,因此有必要编写一组以下变量:

  1. values = {x, y, z}
  2. if 0 in values:
  3. mylist.append("c")
  4. if 1 in values:
  5. mylist.append("d")

我们可以使用字典简化此操作-这将产生相同的值:

  1. mappings = {0: "c", 1: "d", ...}
  2. for k in mappings:
  3. if k in values:
  4. mylist.append(mappings[k])

或者如果 mylist 如果是任意的,则可以在值上循环,并将其与Map匹配:

  1. mappings = {0: "c", 1: "d", ...}
  2. for v in (x, y, z):
  3. if v in mappings:
  4. mylist.append(mappings[v])
展开查看全部
llew8vvj

llew8vvj3#

您可以通过两种方式来开发它

  1. def compareVariables(x,y,z):
  2. mylist = []
  3. if x==0 or y==0 or z==0:
  4. mylist.append('c')
  5. if x==1 or y==1 or z==1:
  6. mylist.append('d')
  7. if x==2 or y==2 or z==2:
  8. mylist.append('e')
  9. if x==3 or y==3 or z==3:
  10. mylist.append('f')
  11. else:
  12. print("wrong input value!")
  13. print('first:',mylist)
  14. compareVariables(1, 3, 2)

  1. def compareVariables(x,y,z):
  2. mylist = []
  3. if 0 in (x,y,z):
  4. mylist.append('c')
  5. if 1 in (x,y,z):
  6. mylist.append('d')
  7. if 2 in (x,y,z):
  8. mylist.append('e')
  9. if 3 in (x,y,z):
  10. mylist.append('f')
  11. else:
  12. print("wrong input value!")
  13. print('second:',mylist)
  14. compareVariables(1, 3, 2)
展开查看全部
uujelgoq

uujelgoq4#

问题

而用于测试多个值的模式

  1. >>> 2 in {1, 2, 3}
  2. True
  3. >>> 5 in {1, 2, 3}
  4. False

非常可读,在许多情况下都能工作,但有一个陷阱:

  1. >>> 0 in {True, False}
  2. True

但是我们想要

  1. >>> (0 is True) or (0 is False)
  2. False

解决方案

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

  1. >>> any([0 is True, 0 is False])
  2. False

可以写成

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

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

展开查看全部
qltillow

qltillow5#

这对你有帮助。

  1. def test_fun(val):
  2. x = 0
  3. y = 1
  4. z = 2
  5. myList = []
  6. if val in (x, y, z) and val == 0:
  7. myList.append("C")
  8. if val in (x, y, z) and val == 1:
  9. myList.append("D")
  10. if val in (x, y, z) and val == 2:
  11. myList.append("E")
  12. test_fun(2);
a64a0gku

a64a0gku6#

你可以把这个联合起来

  1. x = 0
  2. y = 1
  3. z = 3

在一个变量中。

  1. In [1]: xyz = (0,1,3,)
  2. In [2]: mylist = []

将我们的条件更改为:

  1. In [3]: if 0 in xyz:
  2. ...: mylist.append("c")
  3. ...: if 1 in xyz:
  4. ...: mylist.append("d")
  5. ...: if 2 in xyz:
  6. ...: mylist.append("e")
  7. ...: if 3 in xyz:
  8. ...: mylist.append("f")

输出:

  1. In [21]: mylist
  2. Out[21]: ['c', 'd', 'f']
展开查看全部
xmd2e60i

xmd2e60i7#

单线解决方案:

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

或:

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

hc2pp10m8#

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

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

并给出:

  1. ['c', 'd', 'f']
fnatzsnv

fnatzsnv9#

您可以使用字典:

  1. x = 0
  2. y = 1
  3. z = 3
  4. list=[]
  5. dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
  6. if x in dict:
  7. list.append(dict[x])
  8. else:
  9. pass
  10. if y in dict:
  11. list.append(dict[y])
  12. else:
  13. pass
  14. if z in dict:
  15. list.append(dict[z])
  16. else:
  17. pass
  18. print list
展开查看全部
jgwigjjp

jgwigjjp10#

看起来你在制造凯撒密码。
更普遍的方法是:

  1. input_values = (0, 1, 3)
  2. origo = ord('c')
  3. [chr(val + origo) for val in inputs]

输出

  1. ['c', 'd', 'f']

不确定这是否是代码的预期副作用,但输出的顺序将始终被排序。
如果这是您想要的,最后一行可以更改为:

  1. sorted([chr(val + origo) for val in inputs])
w6mmgewl

w6mmgewl11#

要使用一个值测试多个变量,请执行以下操作: if 1 in {a,b,c}: 要使用一个变量测试多个值,请执行以下操作: if a in {1, 2, 3}:

wlsrxk51

wlsrxk5112#

这可以很容易地做到

  1. for value in [var1,var2,var3]:
  2. li.append("targetValue")
sirbozc5

sirbozc513#

也许你们需要输出位集合的直接公式。

  1. x=0 or y=0 or z=0 is equivalent to x*y*z = 0
  2. x=1 or y=1 or z=1 is equivalent to (x-1)*(y-1)*(z-1)=0
  3. x=2 or y=2 or z=2 is equivalent to (x-2)*(y-2)*(z-2)=0

让我们Map到bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000 isc的关系(即“c”):

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

使用数学公式https://youtu.be/kadkcgbgk0k?list=plni9xbpdzuamul8htsl6vtopqrrn3hhfp&t=315
[c] : (xyz=0 and isc=1) or (((xyz=0 and isc=1) or (isc=0)) and (isc=0)) [d] : ((x-1)(y-1)(z-1)=0 and isc=2) or (((xyz=0 and isd=2) or (isc=0)) and (isc=0)) ...
通过以下逻辑连接这些公式:
逻辑 and 是方程的平方和
逻辑 or 是方程的乘积
你们有一个表示和的总方程,你们有和的总公式
那么和1是c,和2是d,和4是e,和5是f
在此之后,您可以形成预定义的数组,其中字符串元素的索引将对应于就绪字符串。 array[sum] 给你线。

展开查看全部
8mmmxcuj

8mmmxcuj14#

用python表示伪代码的最具python风格的方式是:

  1. x = 0
  2. y = 1
  3. z = 3
  4. mylist = []
  5. if any(v == 0 for v in (x, y, z)):
  6. mylist.append("c")
  7. if any(v == 1 for v in (x, y, z)):
  8. mylist.append("d")
  9. if any(v == 2 for v in (x, y, z)):
  10. mylist.append("e")
  11. if any(v == 3 for v in (x, y, z)):
  12. mylist.append("f")
sirbozc5

sirbozc515#

你误解了布尔表达式的工作原理;它们不像一个英语句子,你猜这里所有名字的比较都是一样的。您正在寻找:

  1. if x == 1 or y == 1 or z == 1:
  2. ``` `x` 及 `y` 否则将自行进行评估( `False` 如果 `0` , `True` 否则)。
  3. 您可以使用对元组的包含测试来缩短该时间:

if 1 in (x, y, z):

  1. 或者更好:

if 1 in {x, y, z}:

  1. 使用 `set` 利用固定成本成员资格测试(即。 `in` 无论左侧操作数是什么,都需要固定的时间)。
  2. #### 解释
  3. 当你使用 `or` python将运算符的每一侧视为单独的表达式。表情 `x or y == 1` 被视为的第一个布尔测试 `x` ,则如果该表达式为false `y == 1` 这是测试。
  4. 这是由于运算符优先级。这个 `or` 运算符的优先级低于 `==` 测试,因此首先对后者进行评估。
  5. 然而,即使事实并非如此,这种表达方式 `x or y or z == 1` 实际上被解释为 `(x or y or z) == 1` 相反,这仍然不会达到您期望的效果。 `x or y or z` 将评估为第一个“真实”的参数,例如不 `False` ,数值0或空(有关python在布尔上下文中认为为false的内容的详细信息,请参见布尔表达式)。
  6. 那么对于价值观呢 `x = 2; y = 1; z = 0` , `x or y or z` 决心 `2` ,因为这是参数中的第一个类真值。然后 `2 == 1` 会是 `False` 尽管 `y == 1` 会是 `True` .
  7. 这同样适用于相反的情况;针对单个变量测试多个值; `x == 1 or 2 or 3` 也会因为同样的原因而失败。使用 `x == 1 or x == 2 or x == 3` `x in {1, 2, 3}` .
展开查看全部

相关问题