12

私は何度も自分自身を見つけました。私はすべてまたは少なくとも1つが何かに等しい必要があるものであり、私はそのようなものを書くでしょう:

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

また

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

物事の数が少ない場合でも大丈夫ですが、それでもエレガントではありません。それで、かなりの数の物事を行うためのより良い方法はありますか?ありがとうございます。

4

3 に答える 3

27

オプション1:任意/すべて

一般的なケースについては、とを見てanyください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:

2番目の例では、次を使用できます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 に答える