2016-05-24 6 views
2

非常に特定のルールセットに対して特定のリストをチェックしようとしています。 この特定の例では、終了コードの一覧があり、テストが失敗したかどうかを確認したいと考えています。終了コードの一つでも0リスト内の各項目に対して '条件があるかどうか'を確認する方法

私の現在の実装でない場合、テストは失敗します。

for exit_code in result_list: 
    if exit_code is not 0: 
     raise TestFailed 

質問:それは一つに最初の2行を詰め込むすることは可能でしょうか?そうすることが望ましいですか?

+1

私見を見つけようとします。私は個人的には、コードが読みにくくなるため、 'int'から' bool'への暗黙的な変換を使わないことをお勧めします。私はexplicitnessを好む。ループがライブラリ関数の中にあるので、 'any'の唯一の利点はより良い性能かもしれません。しかし、これは時期尚早の最適化やパフォーマンスのボトルネックではない可能性があります。 – Markus

答えて

4

また、このようanyまたはallを使用することができます:1は真で、0であるため

>>> any(exit_code !=0 for exit_code in result_list) 
True 
>>> all(exit_code==0 for exit_code in result_list) 
False 

Pythonではfalseです。

any(result_list)は0(真)ではない任意の1つの要素any`はあなたのコードをより読みやすくはありません `使用

+1

適切なソリューションを提供するだけでなく、私が慣れていない2つの同様の方法を提供するための正解とマークされています。各関数が何を返すかを説明するだけでなく、 –

+0

'all(result_list) 'を使用しています。ここでは間違っています。 'all'に渡す前に要素を否定しなければなりません。 'error_found =すべてではありません(result_listのiではありません)'。 'all'に渡す前のリストの否定は省略できません。 – Markus

+0

ここで 'all'を使っている@Markusは、すべてのケースをパスしないので少し危険です。たとえば、 '[0、0、1、0、0]' - > 'not all()'は 'True'になり、コードも' True'になります。ここで 'all'を使うことはできません。親切に投票を削除してください。 – ritesht93

5

あなたはanyを使用することができます。

if any(exit_code != 0 for exit_code in result_list): 
    raise TestFailed 

注上記の方法は、あなたもFalseブールと等価な値をチェックしていることを前提としていること(例えばNone、またはFalseとして!)。あなたはresult_listは数値のみが含まれていることを確信している場合は、もう少しそれを短縮することができます。

if any(result_list): 
    raise TestFailed 
+0

私は@ ritesht93の答えを正しいものとしてマークしましたが、これを実装する方法についての非常に良い説明が含まれているので、この回答も同様に強調しました。 2番目に短い実装が本当に好きでした。とてもきれいです! –

関連する問題