私は何度も自分自身を見つけました。私はすべてまたは少なくとも1つが何かに等しい必要があるものであり、私はそのようなものを書くでしょう:
if a==1 and b==1:
do something
また
if a==1 or b==1:
do something
物事の数が少ない場合でも大丈夫ですが、それでもエレガントではありません。それで、かなりの数の物事を行うためのより良い方法はありますか?ありがとうございます。
私は何度も自分自身を見つけました。私はすべてまたは少なくとも1つが何かに等しい必要があるものであり、私はそのようなものを書くでしょう:
if a==1 and b==1:
do something
また
if a==1 or b==1:
do something
物事の数が少ない場合でも大丈夫ですが、それでもエレガントではありません。それで、かなりの数の物事を行うためのより良い方法はありますか?ありがとうございます。
オプション1:任意/すべて
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):
これをチェックしてください
if all(x >= 2 for x in (A, B, C, D)):
ここで、A、B、C、Dはすべて変数です。
私はこのフォームが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