如何测试多个变量与单个值的相等性?

How to test multiple variables for equality against a single value?

提问人:user1877442 提问时间:2/27/2013 最后编辑:Mateen Ulhaquser1877442 更新时间:5/20/2023 访问量:543300

问:

我正在尝试制作一个函数,该函数将多个变量与整数进行比较并输出三个字母的字符串。我想知道是否有办法将其翻译成 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"]
python if-语句 比较 匹配 布尔逻辑

评论

8赞 12/6/2017
在 (元组) 中使用1
7赞 eddd 6/5/2018
当您想以任意/所有方式计算语句列表时,您可以使用 / 函数。例如:将返回 False 将返回 True 将返回 False 将返回 Trueanyallall([1, 2, 3, 4, False])all([True, 1, 2, 3])any([False, 0, 0, False])any([False, 0, True, False])
11赞 Aran-Fey 4/10/2019
这个问题是一个非常受欢迎的重复目标,但我认为它对于这个目的来说是次优的。大多数人尝试做类似的事情,这当然类似于 ,但对于新手来说可能有点混乱。鉴于“为什么我的 x == 0 或 1 不起作用?”问题的数量之多,我宁愿将这个问题用作这些问题的规范重复目标。if x == 0 or 1:if x or y == 0:
2赞 smci 4/10/2019
与“falsey”值(如 或 )进行比较时要格外小心。你可以很容易地写出错误的代码,给出“正确”的答案。00.0False
5赞 tripleee 1/8/2020
相反,请参阅在 Python 中将字符串与多个项目进行比较

答:

1119赞 Martijn Pieters 2/27/2013 #1

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

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

x并以其他方式自行评估(如果,否则)。yFalse0True

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

if 1 in (x, y, z):

或者更好的是:

if 1 in {x, y, z}:

使用集合来利用恒定成本成员测试(即 无论左操作数是什么,都需要固定的时间)。in

解释

当您使用 时,python 将运算符的每一侧视为单独的表达式。该表达式首先被视为 的布尔测试,如果为 False,则测试该表达式。orx or y == 1xy == 1

这是由于运算符优先级。运算符的优先级低于测试,因此首先评估后者。or==

但是,即使情况并非如此,并且表达式实际上被解释为相反,这仍然不会执行您期望它执行的操作。x or y or z == 1(x or y or z) == 1

x or y or z将计算为第一个“真实”的参数,例如 not 、数字 0 或空(有关 Python 在布尔上下文中认为 false 的详细信息,请参阅布尔表达式)。False

因此,对于值,将解析为 ,因为这是参数中的第一个类似 true 的值。然后是 ,即使会是 。x = 2; y = 1; z = 0x or y or z22 == 1Falsey == 1True

反之亦然;针对单个变量测试多个值; 会因为同样的原因而失败。使用 或 .x == 1 or 2 or 3x == 1 or x == 2 or x == 3x in {1, 2, 3}

评论

155赞 SingleNegationElimination 10/24/2013
我不会那么快去买这个版本。元组的创建和迭代成本非常低。至少在我的机器上,只要元组的大小约为 4-8 个元素,元组就比集合更快。如果您必须扫描更多,请使用集合,但如果您正在寻找 2-4 种可能性中的项目,元组仍然更快!如果你能将最有可能的情况安排在元组中排在第一位,那么胜利就更大了:(我的测试:settimeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1)))))
71赞 Martijn Pieters 10/24/2013
@dequestarmappartialsetattr:在 Python 3.3 及更高版本中,集合存储为常量,完全绕过创建时间,消除了创建时间。创建元组可能很便宜,因为 Python 缓存了一堆元组以避免内存变动,这使得它与这里的集合最大的区别。
18赞 Martijn Pieters 10/24/2013
@dequestarmappartialsetattr:如果对成员测试进行计时,对于整数,集合和元组在理想情况下同样快;匹配第一个元素。在那之后,元组将输给集合。
26赞 ShadowRanger 9/4/2016
@MartijnPieters:除非文字的内容也是文字,否则在此测试中使用文字符号不会节省费用,对吧? 无法缓存 ,因为 和 可能会更改,因此任何一个解决方案都需要从头开始构建,我怀疑您在检查成员资格时可能获得的任何查找节省都会被更长的创建时间所淹没。setsetif 1 in {x, y, z}:setxyztuplesetset
14赞 Martijn Pieters 9/4/2016
@ShadowRanger:是的,窥视孔优化(无论是 FOR 还是 )只有在列表或集合的内容也是不可变的文字时才有效。未来的语言更新可能会改变这一点。in [...]in {...}
55赞 akaRem 7/12/2013 #2

直接的写作方式是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)

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

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

评论

9赞 SethMMorton 2/9/2014
在您的 而不是键的示例中,您将收到错误,因为 的返回值是 ,并且调用会给出一个 .不过,总的来说,我同意这种方法。dict.appendNoneNoneAttributeError
4赞 Mahmoud Elshahat 4/7/2019
字典而不是键是错误的,即使你注释掉了“for..循环“部分
2赞 Alex 9/16/2019
在您的第一个示例中,将比 更好,因为它将仅返回 lambda 计算结果为 true 的实例filtermap
4赞 wjandrea 2/8/2020
理解比 lambda 的映射简单得多:any(v == 0 for v in (x, y, z))
118赞 dansalmo 7/12/2013 #3

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

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

评论

27赞 aragaer 10/24/2013
甚至导致d = "cdef"MyList = ["cdef"[k] for k in [x, y, z]]
11赞 dansalmo 5/8/2014
map(lambda i: 'cdef'[i], [x, y, z])
2赞 LoneWanderer 3/11/2019
除了我还没有完全习惯的列表理解之外,我们大多数人都有同样的条件反射:建立那个字典!
35赞 GuiltyDolphin 6/5/2014 #4

要检查某个值是否包含在一组变量中,您可以使用内置模块和 .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

等。。。

这比 因为是一个内置模块,并且比使用必须创建自定义就地函数更快、更高效。lambda x: x in (variables)operatorlambda

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

not (x and y and z)

等效:

not all((x, y, z))

评论

3赞 wallacer 6/5/2014
这并不能回答 OP 的问题。它仅涵盖所提供示例中的第一种情况。
32赞 Bhargav Boda 1/13/2015 #5

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

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
28赞 Saksham Varma 2/27/2015 #6
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]
32赞 hamid 4/10/2015 #7

如果要使用 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)
36赞 rassa45 5/25/2015 #8

如果你非常非常懒惰,你可以把这些值放在一个数组中。如

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

程序将检查变量是否不为 null。写上述陈述的另一种方法(更有意义)是

if bool(b)

Bool 是 python 中的一个内置函数,它基本上执行验证布尔语句的命令(如果您不知道那是什么,那就是您现在:)在 if 语句中尝试的内容)

我发现的另一种懒惰方式是:

if any([x==0, y==0, z==0])

评论

8赞 wjandrea 2/8/2020
-1 这里有很多不好的做法。 是 Python 内置的;请改用其他名称,例如。当你可以做一个步骤时,你为什么要分四个步骤构建列表,即?不要使用并行列表,而是使用字典。总而言之,这个解决方案比ThatGuyRussell的解决方案要复杂得多。同样对于最后一部分,为什么不做一个理解,即?数组在 Python 中也是其他东西。listxyzxyz = [x, y, z]any(v == 0 for v in (x, y, z))
33赞 B. M. 6/10/2015 #9

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

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

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

28赞 michael zxc858 6/29/2015 #10

此代码可能会有所帮助

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;
78赞 ThatGuyRussell 8/19/2015 #11

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

if 1 in {x, y, z}:

根据他的建议,您现在将拥有单独的 if 语句,以便 Python 将读取每个语句,无论前者是 OR 。如: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")
...

这将起作用,但是如果您习惯使用字典(请参阅我在那里所做的),您可以通过制作一个初始字典将数字映射到您想要的字母来清理它,然后仅使用 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])

评论

1赞 wjandrea 11/29/2020
@VisioN 你是说?你不需要 ,默认情况下 dicts 会遍历键。关于使用字符串,你的意思是这样的,对吧? 同意,那会更简单。或者更好的是,for number in num_to_letters.keys()for i, c in enumerate('cdef'): if i in {x, y, z}: mylist.append(c)s = 'cdef'; mylist = [s[i] for i in [x, y, z]]
0赞 VisioN 11/29/2020
@wjandrea 是的,你是对的,这是我的错!我完全忘记了默认行为。不幸的是,我无法编辑我的评论,所以我删除了它,因为你在评论中强调了更好的方法。
32赞 Rolf of Saxony 9/10/2016 #12

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

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

12赞 Vinayak Kaniyarakkal 6/5/2017 #13

一线解决方案:

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)]
4赞 Rohit Gawas 8/1/2018 #14

您可以使用字典:

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

评论

1赞 Serg Kryvonos 2/19/2019
这可能会附加相同的内容,然后再附加一次。设置?
10赞 rsalmei 8/6/2018 #15

在 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赞 imposeren 5/4/2019
这种方法比 ' if 2 in (x, y, z): mylist.append('e')' 更通用,因为允许任意比较(例如 ).在 CPython3.6 中,所有 3 种方法(、、)的性能似乎几乎相同(参见 Gistif any(v >= 42 for v in (x, y, z)):2 in {x,y,z}2 in (x,y,z)any(_v == 2 for _v in (x,y,z)))
5赞 firelynx 8/27/2018 #16

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

一个更通用的方法是:

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])
7赞 alamin 9/20/2018 #17

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

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

8赞 Seeni 11/6/2018 #18

它可以很容易地完成

for value in [var1,var2,var3]:
     li.append("targetValue")
17赞 Siddharth Satpathy 12/3/2018 #19

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

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']
10赞 Serg Kryvonos 2/18/2019 #20

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

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 的关系(是 '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]给你字符串。

3赞 Mayur 4/6/2019 #21

这将对你有所帮助。

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);
3赞 Serhii 9/10/2019 #22

你可以把这个联合起来

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']
4赞 Massifox 10/11/2019 #23

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

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

并提供:

['c', 'd', 'f']
1赞 fhgd 11/6/2019 #24

问题

虽然用于测试多个值的模式

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

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

3赞 behnaz.sheikhi 9/9/2020 #25

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

    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)
0赞 Abhishek Kumar Saw 2/27/2021 #26

这是另一种方法:

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

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

评论

0赞 Tomerikoo 4/13/2021
为什么而不是只是?i in [0]i == 0
1赞 Abhishek Kumar Saw 4/13/2021
对于像这个问题这样的单个比较,您可以使用“==”,但如果你想对多个变量进行多次比较,那么你可以使用“in”运算符,例如: if any(i in [0,5,4,9,7] for i in[x,y,z] )
3赞 Antti Haapala -- Слава Україні 4/12/2021 #27

正如这个答案所解释的那样,它不是那样工作的。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])
0赞 SimoN SavioR 1/23/2022 #28

不带 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)
0赞 Elliptica 5/29/2022 #29

首先,对条件的更正:OR

你需要说:

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

原因是“or”将条件拆分为单独的逻辑部分。你原来的陈述是这样写的,这些部分是:

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

例如,最后一部分在检查 z == 0 --- --- 时很好,但前两部分只是说基本上和 .由于整数的计算结果总是为 0,除非它们为 0,这意味着条件的第一部分总是 when 或不等于 0(在 y 的情况下总是,因为你有 ,导致你的整个条件(因为工作方式)总是 。if xif yTrueTruexyy = 1ORTrue

为了避免这种情况,你需要确保你的条件的所有部分(每一面)都有意义(你可以通过假装陈述的另一面不存在来做到这一点)。这就是您确认您的条件是否正确定义的方法。OROROR

您可以像这样单独编写语句:

if x == 0
if y == 0
if z == 0

这意味着带有关键字的正确 mergin 是: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
           ]
    
    
-1赞 sten 6/8/2022 #30
#selection
: a=np.array([0,1,3])                                                                                                                                                 

#options
: np.diag(['c','d','e','f']) 
array([['c', '', '', ''],
       ['', 'd', '', ''],
       ['', '', 'e', ''],
       ['', '', '', 'f']], dtype='<U1')

现在我们可以使用 AS [ROW,COL] 选择器,它的作用类似于 any(...) 条件:

#list of options[sel,sel]
: np.diag(['c','d','e','f'])[a,a]                                                                                                                                     

 array(['c', 'd', 'f'], dtype='<U1')

评论

0赞 OneCricketeer 8/22/2022
我不认为这个问题是在问numpy
1赞 My Car 11/6/2022 #31

要针对单个值测试多个变量,请执行以下操作:

将变量包装在一个集合对象中,例如 {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')