你如何在条件中使用OR,AND?

时间:2012-05-29 23:13:13

标签: python conditional

我已经多次找到自己,我需要全部或至少一个等于某事的东西,我会写出类似的东西:

if a==1 and b==1:
   do something

if a==1 or b==1:
   do something

如果事物的数量很少就可以了,但它仍然不优雅。所以,对于大量的事情是否有更好的方法,做上述事情?谢谢。

3 个答案:

答案 0 :(得分:28)

选项1:任意/全部

对于一般情况,请查看anyall

if all(x == 1 for x in a, b, c, d):

if any(x == 1 for x in a, b, c, d):

您还可以使用任何可迭代:

if any(x == 1 for x in states):

选项2 - 链接和

对于您的第一个示例,您可以使用布尔运算符链接:

if a == b == c == d == 1:

对于第二个示例,您可以使用in

if 1 in states:

选项3:任何/所有没有谓词

如果你只关心这个值是否真实,你可以进一步简化:

if any(flags):

if all(flags):

答案 1 :(得分:3)

检查出来

if all(x >= 2 for x in (A, B, C, D)):

其中A,B,C,D都是变量......

答案 2 :(得分:0)

我喜欢这种形式,因为它在Python中很容易理解

def cond(t,v):
    return t == v

a=1
b=3    
tests=[(a,1),(b,2)]

print any(cond(t,v) for t,v in tests)  # eq to OR  
print all(cond(t,v) for t,v in tests)  # eq to AND     

打印:

True
False

然后cond()可以根据需要复杂化。

您可以提供可调用的用户或使用operator module以获得更大的灵活性:

import operator

def condOP(t,v,op=operator.eq):
    return op(t,v)

a=1
b=3    
tests=[(a,1,operator.eq),(b,2,operator.gt)]

print any(condOP(*t) for t in tests)  # eq to OR  
print all(condOP(*t) for t in tests)  # eq to AND 

甚至更简单:

tests=[(a,1,operator.eq),(b,2,operator.gt)]

print any(func(t,v) for t,v,func in tests)  # eq to OR  
print all(func(t,v) for t,v,func in tests)  # eq to AND