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

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

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

这样的事情可能吗?

sirbozc5

sirbozc51#

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

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

if 1 in (x, y, z):

或者更好:

if 1 in {x, y, z}:

使用 `set` 利用固定成本成员资格测试(即。 `in` 无论左侧操作数是什么,都需要固定的时间)。

#### 解释

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

siotufzp2#

您的问题更容易通过以下字典结构解决:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
uyto3xhc

uyto3xhc3#

如martijn pieters所述,正确且最快的格式为:

if 1 in {x, y, z}:

使用他的建议,您现在将拥有单独的if语句,以便python将读取每条语句,无论前者是否正确 TrueFalse . 例如:

if 0 in {x, y, z}:
    mylist.append("c")
if 1 in {x, y, z}:
    mylist.append("d")
if 2 in {x, y, z}:
    mylist.append("e")
...

这是可行的,但如果您对使用字典感到满意(请参阅我在这里所做的),您可以通过制作一个初始字典,将数字Map到您想要的字母,然后只使用for循环来解决这个问题:

num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
    if number in {x, y, z}:
        mylist.append(num_to_letters[number])
o7jaxewo

o7jaxewo4#

直接的写作方式 x or y or z == 0

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

但是我不认为你喜欢它这条路很难看。
另一种方法(更好)是:

0 in (x, y, z)

顺便说一句,很多 if s可以写成这样的东西

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break
wgx48brx

wgx48brx5#

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

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

wkftcu5l6#

要检查值是否包含在一组变量中,可以使用内置模块 itertoolsoperator .
例如:
进口:

from itertools import repeat
from operator import contains

声明变量:

x = 0
y = 1
z = 3

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

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 (variables) 因为 operator 是一个内置模块,比使用 lambda 它必须创建一个自定义就地功能。
检查列表中是否存在非零(或假)值的另一个选项:

not (x and y and z)

等价物:

not all((x, y, z))
gzjq41n4

gzjq41n47#

这里提供的所有优秀答案都集中在原始海报的具体要求和 if 1 in {x,y,z} martijn pieters提出的解决方案。
他们忽略了这个问题更广泛的含义:
如何针对多个值测试一个变量?
如果使用字符串,提供的解决方案将不适用于部分命中,例如:
测试字符串“wild”是否包含多个值

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
...

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
...

对于这种情况,最容易转换为字符串

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True

然而,应该注意的是,正如 @codeforester ,使用此方法将丢失单词边界,如中所示:

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True

三个字母 rot 在列表中以组合形式存在,但不能作为单个单词存在。测试“腐烂”会失败,但如果其中一个列表项是“地狱中的腐烂”,那也会失败。
结果是,如果使用此方法,请小心您的搜索条件,并注意它确实有此限制。

uyto3xhc

uyto3xhc8#

我认为这将更好地处理它:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

输出:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
8oomwypt

8oomwypt9#

在这里,set是一种很好的方法,因为它对变量进行排序,这似乎是您的目标。 {z,y,x}{0,1,3} 无论参数的顺序如何。

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

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

hxzsmxv2

hxzsmxv210#

如果要使用if、else语句,以下是另一种解决方案:

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    elif l==1: myList.append('d')
    elif l==2: myList.append('e')
    elif l==3: myList.append('f')

print(myList)
roqulrg3

roqulrg311#

此代码可能会有所帮助

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;
ffscu2ro

ffscu2ro12#

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

tp5buhyn13#

您可以尝试下面所示的方法。在此方法中,您可以自由指定/输入希望输入的变量数量。

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

xmd2e60i14#

单线解决方案:

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

或:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
8mmmxcuj

8mmmxcuj15#

用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")

相关问题