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

发布于 2025-01-12 07:11:55 字数 366 浏览 2 评论 0原文

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

I'm trying to make a function that will compare multiple variables to an integer and output a string of three letters. I was wondering if there was a way to translate this into Python. So say:

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

which would return a list of:

["c", "d", "f"]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(30

山田美奈子 2025-01-19 07:11:58

一行解决方案:

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

One line solution:

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)]
谁的新欢旧爱 2025-01-19 07:11:58

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

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

使用数学 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) or (isc=0)) and (isc=0))

...

通过以下逻辑连接这些公式:

  • 逻辑and是方程的平方和
  • 逻辑的乘积

or 是方程和 你将得到一个总方程
表达 sum 并且你有 sum 的总公式

然后 sum&1 是 c,sum&2 是 d,sum&4 是 e,sum&5 是 f

之后,你可以形成预定义的数组,其中字符串元素的索引将对应于准备好的字符串。

array[sum] 为您提供字符串。

Maybe you need direct formula for output bits set.

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

Let's map to bits: 'c':1 'd':0xb10 'e':0xb100 'f':0xb1000

Relation of isc (is 'c'):

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

Use math if formula 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))

...

Connect these formulas by following logic:

  • logic and is the sum of squares of equations
  • logic or is the product of equations

and you'll have a total equation
express sum and you have total formula of sum

then sum&1 is c, sum&2 is d, sum&4 is e, sum&5 is f

After this you may form predefined array where index of string elements would correspond to ready string.

array[sum] gives you the string.

故人如初 2025-01-19 07:11:58

在 Python 中表示伪代码的最 Pythonic 方式是:

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

The most pythonic way of representing your pseudo-code in Python would be:

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")
落叶缤纷 2025-01-19 07:11:58

这可以很容易地完成

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

It can be done easily as

for value in [var1,var2,var3]:
     li.append("targetValue")
勿忘初心 2025-01-19 07:11:58

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

使用一个变量测试多个值:if a in {1, 2, 3}:< /代码>

To test multiple variables with one single value: if 1 in {a,b,c}:

To test multiple values with one variable: if a in {1, 2, 3}:

青朷 2025-01-19 07:11:58

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

更通用的方法是这样的:

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

Looks like you're building some kind of Caesar cipher.

A much more generalized approach is this:

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

outputs

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

Not sure if it's a desired side effect of your code, but the order of your output will always be sorted.

If this is what you want, the final line can be changed to:

sorted([chr(val + origo) for val in inputs])
离旧人 2025-01-19 07:11:58

您可以使用字典:

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

You can use dictionary :

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
马蹄踏│碎落叶 2025-01-19 07:11:58

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

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

并给出:

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

Without dict, try this solution:

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

and gives:

['c', 'd', 'f']
伤感在游骋 2025-01-19 07:11:58

这会对你有所帮助。

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

This will help you.

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);
懒猫 2025-01-19 07:11:58

您可以将其合并

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

You can unite this

x = 0
y = 1
z = 3

in one variable.

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

Change our conditions as:

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

Output:

In [21]: mylist                                                                                
Out[21]: ['c', 'd', 'f']
寄居者 2025-01-19 07:11:58

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

    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)

you can develop it through two ways

    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)

Or

    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)
安静被遗忘 2025-01-19 07:11:58

不会像这样工作,正如这个答案所解释的

虽然通用答案是使用,

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

The or does not work like that, as explained by this answer.

While the generic answer would be use

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

this is not the best one for the specific problem. In your case you're doing repeated tests, therefore it is worthwhile to compose a set of these variables:

values = {x, y, z}

if 0 in values:
    mylist.append("c")

if 1 in values:
    mylist.append("d")

We can simplify this using a dictionary - this will result in the same values:

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

Or if the ordering of the mylist is arbitrary, you can loop over the values instead and match them to the mappings:

mappings = {0: "c", 1: "d", ...}
for v in (x, y, z):
    if v in mappings:
        mylist.append(mappings[v])
一笔一画续写前缘 2025-01-19 07:11:58

问题

虽然测试多个值的模式

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

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

Problem

While the pattern for testing multiple values

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

is very readable and is working in many situation, there is one pitfall:

>>> 0 in {True, False}
True

But we want to have

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

Solution

One generalization of the previous expression is based on the answer from ytpillai:

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

which can be written as

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

While this expression returns the right result it is not as readable as the first expression :-(

合久必婚 2025-01-19 07:11:58

要针对单个值测试多个变量:

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

To test multiple variables against a single value:

Wrap the variables in a set object, e.g. {a, b, c}.
Use the in operator to test if the value is stored in any of the variables.
The in operator will return True if the 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 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')
伏妖词 2025-01-19 07:11:58

这是另一种方法:

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

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

Here is one more way to do it:

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

It is a mix of list comprehension and any keyword.

谁的新欢旧爱 2025-01-19 07:11:58

不使用 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)

usage without if example:

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)
童话里做英雄 2025-01-19 07:11:58

首先,对 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 --- 但前两部分本质上只是说 if x如果是。由于整数的计算结果始终为 True,除非它们为 0,这意味着当 x时,条件的第一部分始终为 True y 不等于 0(在 y 的情况下总是如此,因为你有 y = 1,导致你的整个情况(因为 OR有效)始终为 True

为了避免这种情况,您可以这样做 。需要确保条件的所有部分(OR 的每一侧)本身都有意义(您可以通过假装 OR 的另一侧来做到这一点code> 语句不存在)。这就是您可以确认 OR 条件是否正确定义的方法,

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

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

这意味着与 的合并正确 。 OR 关键字将是:

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

SECOND, HOW TO解决问题:

您基本上想要检查是否有任何变量与给定的整数匹配,如果是,则为其分配一个与一对一映射中匹配的字母。您希望对某个整数列表执行此操作,以便输出是字母列表。您可以这样做:

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
           ]
    
    

FIRST, A CORRECTION TO THE OR CONDITIONAL:

You need to say:

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

The reason is that "or" splits up the condition into separate logical parts. The way your original statement was written, those parts were:

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

The last part was fine --- checking to see if z == 0, for instance --- but the first two parts just said essentially if x and if y. Since integers always evaluate to True unless they're 0, that means the first part of your condition was always True when x or y didn't equal 0 (which in the case of y was always, since you had y = 1, causing your whole condition (because of how OR works) to always be True.

To avoid that, you need to make sure all parts of your condition (each side of the OR) make sense on their own (you can do that by pretending that the other side(s) of the OR statement doesn't exist). That's how you can confirm whether or not your OR condition is correctly defined.

You would write the statements individually like so:

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

which means the correct mergin with the OR keyword would be:

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

SECOND, HOW TO SOLVE THE PROBLEM:

You're basically wanting to check to see if any of the variables match a given integer and if so, assign it a letter that matches it in a one-to-one mapping. You want to do that for a certain list of integers so that the output is a list of letters. You'd do that like this:

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
        

Similarly, you could use LIST COMPREHENSION to achieve the same result faster:

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
           ]
    
    
少钕鈤記 2025-01-19 07:11:57

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

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

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

Set is the good approach here, because it orders the variables, what seems to be your goal here. {z,y,x} is {0,1,3} whatever the order of the parameters.

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

This way, the whole solution is O(n).

挽梦忆笙歌 2025-01-19 07:11:57

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

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

I think this will handle it better:

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]

Output:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
罗罗贝儿 2025-01-19 07:11:57

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

If you want to use if, else statements following is another solution:

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)
烟若柳尘 2025-01-19 07:11:57

这里提供的所有优秀答案都集中在原始发布者的具体要求上,并集中在 Martijn Pieters 提出的 if 1 in {x,y,z} 解决方案上。
他们忽略的是问题的更广泛含义:
如何针对多个值测试一个变量?
如果使用字符串,则提供的解决方案不适用于部分命中:
测试字符串“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”,那么也会失败。
结果是,如果使用此方法,请小心您的搜索条件,并注意它确实有此限制。

All of the excellent answers provided here concentrate on the specific requirement of the original poster and concentrate on the if 1 in {x,y,z} solution put forward by Martijn Pieters.
What they ignore is the broader implication of the question:
How do I test one variable against multiple values?
The solution provided will not work for partial hits if using strings for example:
Test if the string "Wild" is in multiple values

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

or

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

for this scenario it's easiest to convert to a string

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

It should be noted however, as mentioned by @codeforester, that word boundries are lost with this method, as in:

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

the 3 letters rot do exist in combination in the list but not as an individual word. Testing for " rot " would fail but if one of the list items were "rot in hell", that would fail as well.
The upshot being, be careful with your search criteria if using this method and be aware that it does have this limitation.

扛刀软妹 2025-01-19 07:11:57
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]
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]
平生欢 2025-01-19 07:11:57

这段代码可能会有所帮助

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;

This code may be helpful

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;
凹づ凸ル 2025-01-19 07:11:57

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

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

You can try the method shown below. In this method, you will have the freedom to specify/input the number of variables that you wish to enter.

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']
够钟 2025-01-19 07:11:56

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

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

xy 单独计算(False if 0, 否则为真)。

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

if 1 in (x, y, z):

或者更好的是:

if 1 in {x, y, z}:

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

说明

当您使用 or 时,Python 将运算符的每一侧视为单独的 表达式。表达式 x 或 y == 1 首先被视为对 x 的布尔测试,然后如果为 False,则表达式 y == 1 > 已测试。

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

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

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

因此对于值 x = 2; y = 1; z = 0、x 或 y 或 z 将解析为 2,因为这是参数中第一个类似 true 的值。那么 2 == 1 将为 False,即使 y == 1 将为 True

这同样适用于相反的情况;针对单个变量测试多个值;由于同样的原因,x == 1 or 2 or 3 也会失败。在 {1, 2, 3} 中使用 x == 1 或 x == 2 或 x == 3x。

You misunderstand how boolean expressions work; they don't work like an English sentence and guess that you are talking about the same comparison for all names here. You are looking for:

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

x and y are otherwise evaluated on their own (False if 0, True otherwise).

You can shorten that using a containment test against a tuple:

if 1 in (x, y, z):

or better still:

if 1 in {x, y, z}:

using a set to take advantage of the constant-cost membership test (i.e. in takes a fixed amount of time whatever the left-hand operand is).

Explanation

When you use or, python sees each side of the operator as separate expressions. The expression x or y == 1 is treated as first a boolean test for x, then if that is False, the expression y == 1 is tested.

This is due to operator precedence. The or operator has a lower precedence than the == test, so the latter is evaluated first.

However, even if this were not the case, and the expression x or y or z == 1 was actually interpreted as (x or y or z) == 1 instead, this would still not do what you expect it to do.

x or y or z would evaluate to the first argument that is 'truthy', e.g. not False, numeric 0 or empty (see boolean expressions for details on what Python considers false in a boolean context).

So for the values x = 2; y = 1; z = 0, x or y or z would resolve to 2, because that is the first true-like value in the arguments. Then 2 == 1 would be False, even though y == 1 would be True.

The same would apply to the inverse; testing multiple values against a single variable; x == 1 or 2 or 3 would fail for the same reasons. Use x == 1 or x == 2 or x == 3 or x in {1, 2, 3}.

幸福丶如此 2025-01-19 07:11:56

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

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

Your problem is more easily addressed with a dictionary structure like:

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
来日方长 2025-01-19 07:11:56

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

As stated by Martijn Pieters, the correct, and fastest, format is:

if 1 in {x, y, z}:

Using his advice you would now have separate if-statements so that Python will read each statement whether the former were True or False. Such as:

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

This will work, but if you are comfortable using dictionaries (see what I did there), you can clean this up by making an initial dictionary mapping the numbers to the letters you want, then just using a for-loop:

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])
深居我梦 2025-01-19 07:11:56

x or y or z == 0 的直接写法是

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

But I don't think, you like it. :)
而且这种方式很丑陋。

另一种方式(更好)是:

0 in (x, y, z)

顺便说一句,很多 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

The direct way to write x or y or z == 0 is

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

But I dont think, you like it. :)
And this way is ugly.

The other way (a better) is:

0 in (x, y, z)

BTW lots of ifs could be written as something like this

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
林空鹿饮溪 2025-01-19 07:11:56

要检查某个值是否包含在一组变量中,您可以使用内置模块 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 具有优势(变量)因为operator 是一个内置模块,比使用必须创建自定义就地函数的 lambda 更快、更高效。

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

not (x and y and z)

等效:

not all((x, y, z))

To check if a value is contained within a set of variables you can use the inbuilt modules itertools and operator.

For example:

Imports:

from itertools import repeat
from operator import contains

Declare variables:

x = 0
y = 1
z = 3

Create mapping of values (in the order you want to check):

check_values = (0, 1, 3)

Use itertools to allow repetition of the variables:

check_vars = repeat((x, y, z))

Finally, use the map function to create an iterator:

checker = map(contains, check_vars, check_values)

Then, when checking for the values (in the original order), use next():

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

etc...

This has an advantage over the lambda x: x in (variables) because operator is an inbuilt module and is faster and more efficient than using lambda which has to create a custom in-place function.

Another option for checking if there is a non-zero (or False) value in a list:

not (x and y and z)

Equivalent:

not all((x, y, z))
碍人泪离人颜 2025-01-19 07:11:56

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

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

If you ARE very very lazy, you can put the values inside an array. Such as

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

You can also put the numbers and letters in a dictionary and do it, but this is probably a LOT more complicated than simply if statements. That's what you get for trying to be extra lazy :)

One more thing, your

if x or y or z == 0:

will compile, but not in the way you want it to. When you simply put a variable in an if statement (example)

if b

the program will check if the variable is not null. Another way to write the above statement (which makes more sense) is

if bool(b)

Bool is an inbuilt function in python which basically does the command of verifying a boolean statement (If you don't know what that is, it is what you are trying to make in your if statement right now :))

Another lazy way I found is :

if any([x==0, y==0, z==0])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文