12

我发现自己很多次,我需要全部或至少一个等于某物的东西,我会写这样的东西:

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

或者

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

如果事情的数量很少,它可以,但它仍然不优雅。那么,有没有更好的方法来处理大量的事情,做上面的事情?谢谢。

4

3 回答 3

27

选项1:任何/全部

对于一般情况,请查看anyand all

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):
于 2012-05-29T23:16:02.473 回答
3

看一下这个

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

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

于 2012-05-29T23:17:56.960 回答
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()可以根据需要变得复杂。

您可以提供用户可调用或使用操作员模块以获得更大的灵活性:

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     
于 2012-05-29T23:30:43.450 回答