2016-12-05 6 views
0

私は、リスト内のすべての項目が真と評価された場合にのみ実行したいという条件があります。この例は、ブール(私の状況が、説明するのが容易ではない、実際に)返す関数のリストのようなものかもしれません:Pythonのbooleanリストにmin/maxを使用していますか?

def foo(): 
    # do something 
def bar(): 
    # do something 
def baz(): 
    # do something 

fncs = [foo, bar, baz] 
if <every element in [fnc() for fnc in fncs] evaluates to true>: 
    # do something 

私は間違いなくこれを行うことができます知っている:

all_true = True 
for fnc in fncs: 
    if not fnc(): 
     all_true = False 
if all_true: 
    # do something 

しかし、これが悪い形であれば、私は思っていた。また

if min([fnc() for fnc in fncs]): 
    # do something 

私はリスト内包中にすべての偽の要素を選択し、リストが占有されているかどうかを確認しようとすることができ、(これは動作しますBOOL(ARR)ARR)のリストがあればFalseを返すと編曲が空の場合のみ、次のとおりです。

if not [None for fnc in fncs if not fnc()]: 
    # do something 

私は「分」のような感じでは最後の方法よりも多くきれいで、最初のものは、最も簡単である一方、初心者を理解するには、何が起こっているのかがはっきりしているはずです。私は交互にエイリアシングを通してそれを明確にすることができました:

all_true = min 
if all_true([fnc() for fnc in fncs]): 
    # do something 

私はこれを行うための他の方法も忘れました。どの方法が最も望ましいのだろうかと思っています。

ありがとうございました!

+0

ほとんどの言語は、リスト内のすべてのアイテムは、述語を満たすかどうかを確認する 'every'機能を持っています。私はPythonがそのような機能を持っていると思います。 – Carcigenicate

+7

iterableのすべてが真であるかどうかを確認するには 'all'関数を使います。 –

+2

iterableの項目が真であるかどうかをチェックする 'any'もあります。 –

答えて

2

minを使用すると、「悪い」ではありませんが、で、不必要な作業を行います。代わりにallを使用してください。

if all(fnc() for fnc in fncs): 
    # do something 

すべての値がTrueあり、Falseそうでない場合、これはTrueを返します。シーケンス全体を少なくとも1回は実行する必要があるminとは異なり、値がFalseであれば早期に終了するという追加の利点があります。

すべてがFalseであるかどうかを評価する必要がある場合は、同様の「できるだけ早く終了」動作を持つany(特に、not any(...))をお勧めします。あなたはおそらくall組み込み関数を探している

1

print all(f() for f in [foo, bar, baz]) 
関連する問題