2016-02-07 7 views
21

すべての値、つまり辞書のすべてのキーに対応する値が0であるかどうかをチェックしたいと思います。ループなしで行う方法はありますか?もしそうなら、どのように?Pythonで辞書のすべての値が0であるかどうかをチェックする方法は?

+0

ある他、0ではありませんループ? –

+0

私は辞書を繰り返してすべての値、すなわち1つでも真でない場合はすべてのキーに対応する値をチェックしました。私はフラグ値を変更してループから逸脱しました。 –

答えて

45

使用all():与えられたイテラブルのすべての要素に該当する場合True

all(value == 0 for value in your_dict.values()) 

all戻ります。 all

4

any()メソッドを使用することができます。基本的にブール値のパラメータをチェックしますが、0はこの場合はFalse、その他の数値はTrueとして動作します。 このコードを試してみてください。

dict1 = {"a": 0, "b": 1} 
dict2 = {"a": 0, "b": 0} 

print not any(dict1.itervalues()) 
print not any(dict2.itervalues()) 

出力:

False 
True 

EDIT2:要素の空のリストとのいずれかを呼び出す1追記/注意は、()はFALSEを返します。

+1

'all'も怠惰です。 – timgeb

+0

@timgeb correct、コメントありがとうございました – Fanchi

+3

これは、間違った値、[]、なし、{}などに対して間違った結果をもたらします。 –

7

>>> d = {1:0, 2:0, 3:1} 
>>> all(x==0 for x in d.values()) 
False 
>>> d[3] = 0 
>>> all(x==0 for x in d.values()) 
True 

あなたがanyallを使用するかどうかに関係なく、評価が怠惰になります。 allは、遭遇した最初の偽値にFalseを返します。 anyは、遭遇する最初の真理値にTrueを返します。

したがって、not any(d.values())は、私が提供した辞書の例と同じ結果になります。それは発電機の理解とallバージョンより少し短くなります。個人的には、私はまだallヴァリエーションが好きです。読者が頭の中で論理否定をしなくても、あなたが望むものを表現するからです。

ここanyを使用して1つの以上の問題はしかし、あります:

>>> d = {1:[], 2:{}, 3:''} 
>>> not any(d.values()) 
True 

辞書は値0が含まれていませんが、すべての値は、空のリストについては、すなわちbool(value)リターンFalse falsyあるためnot any(d.values())Trueを返します。 、辞書または文字列。

要約すると、可読性は明らかであり、allソリューションを使用してください。

+0

'not any'は、すべての値が_falsey_の場合にTrueと評価されるため、すべての値が '0'に等しい場合はテストとは異なります。 –

2

あなたはまた、それをいずれかを使用して、他の方法で行うことができます:それはtrueを返す場合

>>> any(x != 0 for x in somedict.values()) 

を、そしてすべてのキーは、すべてのキーは、あなたがそれを行うましたか0

関連する問題