如何测试多个变量与单个值是否相等?

2024-11-15 08:36:00
admin
原创
15
摘要:问题描述:我正在尝试编写一个函数,它将多个变量与一个整数进行比较并输出一个由三个字母组成的字符串。我想知道是否有办法将其翻译成 Python。所以说:x = 0 y = 1 z = 3 mylist = [] if x or y or z == 0: mylist.append("c&qu...

问题描述:

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

解决方案 1:

您误解了布尔表达式的工作原理;它们不像英语句子那样工作,并且猜测您在这里谈论的是所有名称的相同比较。您正在寻找:

if x == 1 or y == 1 or z == 1:

xy以其他方式自行评估(False如果0True否则)。

您可以使用针对元组的包含测试来缩短它:

if 1 in (x, y, z):

或者更好的是:

if 1 in {x, y, z}:

使用aset来利用恒定成本成员资格测试(即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 在布尔上下文中将什么视为假的详细信息,请参阅布尔表达式)。

因此对于值x = 2; y = 1; z = 0x or y or z将解析为2,因为这是参数中第一个类似真的值。然后2 == 1将是False,尽管y == 1将是True

同样的道理也适用于逆向;针对单个变量测试多个值;x == 1 or 2 or 3会因相同的原因而失败。使用x == 1 or x == 2 or x == 3x in {1, 2, 3}

解决方案 2:

使用如下字典结构可以更轻松地解决您的问题:

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

解决方案 3:

正如 Martijn Pieters 所述,正确且最快的格式是:

if 1 in {x, y, z}:

根据他的建议,你现在将拥有单独的 if 语句,以便 Python 可以读取每个语句,无论前者是True还是False。例如:

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

这会起作用,但是如果你习惯使用字典(看看我在那里做了什么),你可以通过创建一个初始字典来清理它,将数字映射到你想要的字母,然后只需使用 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])

解决方案 4:

直接写法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)

顺便说一下,很多ifs 可以写成这样

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

解决方案 5:

要检查某个值是否包含在一组变量中,您可以使用内置模块 itertoolsoperator

例如:

进口:

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

ETC...

这比其他方法更有优势,lambda x: x in (variables)因为它是一个内置模块,并且比使用必须创建自定义就地函数的方法operator更快、更高效。lambda

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

not (x and y and z)

相等的:

not all((x, y, z))

解决方案 6:

如果你非常懒,你可以把值放在数组中。例如

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

解决方案 7:

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

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

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

解决方案 8:

我认为这样可以更好地处理:

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

解决方案 9:

如果您想使用 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)

解决方案 10:

这里提供的所有优秀答案都集中在原始发帖人的特定要求上,并集中在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

这 3 个字母rot确实以组合形式存在于列表中,但不是作为单个单词存在。测试“rot”会失败,但如果列表项之一是“rot in hell”,也会失败。

结果是,如果使用此方法,请谨慎选择搜索条件,并注意它确实有此限制。

解决方案 11:

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]

解决方案 12:

此代码可能有用

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;

解决方案 13:

您可以尝试以下方法。在此方法中,您可以自由指定/输入想要输入的变量数量。

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

解决方案 14:

一行解决方案:

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

解决方案 15:

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

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':0xb100 'f':0xb1000

isc (is 'c') 的关系:

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

如果公式使用数学https://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315

[三]:(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是方程的乘积

你会得到一个表达和的总方程,并且你会得到和的总公式

那么 sum&1 是 c,sum&2 是 d,sum&4 是 e,sum&5 是 f

在此之后,您可以形成预定义数组,其中字符串元素的索引将对应于现成的字符串。

array[sum]给你字符串。

解决方案 16:

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

解决方案 17:

可以很容易地做到

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

解决方案 18:

要使用一个值测试多个变量:if 1 in {a,b,c}:

要使用一个变量测试多个值:if a in {1, 2, 3}:

解决方案 19:

看起来你正在构建某种凯撒密码。

一种更加通用的方法是这样的:

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

输出

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

不确定这是否是您的代码所期望的副作用,但您的输出顺序将始终被排序。

如果这是您想要的,最后一行可以改为:

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

解决方案 20:

您可以使用字典:

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list

解决方案 21:

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

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

并给出:

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

解决方案 22:

这会对你有帮助。

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

解决方案 23:

你可以团结起来

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

解决方案 24:

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

    def compareVariables(x,y,z):
        mylist = []
        if x==0 or y==0 or z==0:
            mylist.append('c')
        if  x==1 or y==1 or z==1:
            mylist.append('d')
        if  x==2 or y==2 or z==2:
            mylist.append('e')
        if  x==3 or y==3 or z==3:
            mylist.append('f')
        else:
            print("wrong input value!")
        print('first:',mylist)

        compareVariables(1, 3, 2)

或者

    def compareVariables(x,y,z):
        mylist = []
        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')
        if 3 in (x,y,z):
             mylist.append('f')
        else:
             print("wrong input value!")
        print('second:',mylist)

        compareVariables(1, 3, 2)

解决方案 25:

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

解决方案 26:

问题

虽然测试多个值的模式

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

解决方案

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

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

可以写成

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

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

解决方案 27:

要根据单个值测试多个变量:

将变量包装在一个集合对象中,例如 {a, b, c}。使用 in 运算符测试值是否存储在任何变量中。如果值存储在至少一个变量中,则 in 运算符将返回 True。

# ✅ test multiple variables against single value using tuple

if 'a' in (a, b, c):
    print('value is stored in at least one of the variables')

# ---------------------------------------------------------

# ✅ test multiple variables against single value using tuple

if 'a' in {a, b, c}:
    print('value is stored in at least one of the variables')

# ---------------------------------------------------------


# ✅ test multiple variables against single value (OR operator chaining)
if a == 'a' or b == 'a' or c == 'a':
    print('value is stored in at least one of the variables')

解决方案 28:

这是另一种方法:

x = 0
y = 1
z = 3
mylist = []

if any(i in [0] for i in[x,y,z]):
    mylist.append("c")
if any(i in [1] for i in[x,y,z]):
    mylist.append("d")
if any(i in [2] for i in[x,y,z]):
    mylist.append("e")
if any(i in [3] for i in[x,y,z]):
    mylist.append("f")

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

解决方案 29:

不带 if 的用法示例:

x,y,z = 0,1,3
values = {0:"c",1:"d",2:"e",3:"f"} # => as if usage
my_list = [values[i] for i in (x,y,z)]

print(my_list)

解决方案 30:

首先,对条件句进行修正OR

你需要说:

if x == 0 or y == 0 or z == 0:

原因是“或”将条件拆分为单独的逻辑部分。按照您最初的陈述的写法,这些部分是:

x
y
z == 0   // or 1, 2, 3 depending on the if statement

最后一部分很好 --- 例如检查 z == 0 --- 但前两部分只是说本质上if xif y。由于整数总是计算为True除非它们是 0,这意味着条件的第一部分总是Truexy不等于 0 时(在 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 COMPREHENSION 来更快地实现相同的结果:

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
           ]
    
    
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用