すべての値、つまり辞書のすべてのキーに対応する値が0であるかどうかをチェックしたいと思います。ループなしで行う方法はありますか?もしそうなら、どのように?Pythonで辞書のすべての値が0であるかどうかをチェックする方法は?
答えて
使用all()
:与えられたイテラブルのすべての要素に該当する場合True
all(value == 0 for value in your_dict.values())
all
戻ります。 all
で
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を返します。
:
>>> 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
あなたがany
やall
を使用するかどうかに関係なく、評価が怠惰になります。 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
ソリューションを使用してください。
'not any'は、すべての値が_falsey_の場合にTrueと評価されるため、すべての値が '0'に等しい場合はテストとは異なります。 –
あなたはまた、それをいずれかを使用して、他の方法で行うことができます:それはtrueを返す場合
>>> any(x != 0 for x in somedict.values())
を、そしてすべてのキーは、すべてのキーは、あなたがそれを行うましたか0
ある他、0ではありませんループ? –
私は辞書を繰り返してすべての値、すなわち1つでも真でない場合はすべてのキーに対応する値をチェックしました。私はフラグ値を変更してループから逸脱しました。 –