2016-02-07 207 views
21

我想檢查是否所有的值,即對應於字典中的所有鍵的值是0.有沒有辦法做到沒有循環?如果是這樣如何?如何在Python中檢查字典的所有值是否爲0?

+0

你怎麼用做循環? –

+0

我遍歷字典,並檢查所有的值,即對應於所有鍵的值,如果即使一個不是真的我改變了標誌值和爆發的循環。 –

回答

45

使用all()

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

all返回True如果給定的迭代的所有元素都是如此。

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:一個旁註/警告,稱任何()的元素的空列表將返回FALSE。

+1

'all'也很懶。 – timgeb

+0

@timgeb正確,謝謝你的評論 – Fanchi

+3

這將給任何虛假價值,[],無,{}等不正確的結果。 –

7

隨着all

>>> 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在這裏,雖然:

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

的字典裏沒有包含值0,但not any(d.values())將返回True,因爲所有的值都是falsy,即bool(value)回報False一個空列表,字典或字符串。

總結:可讀性計數是明確的,使用all解決方案。

+0

如果所有的值都是_falsey_,那麼'not any'將被評估爲True,因此如果所有的值都等於'0',則不同於測試。 –

2

你也可以做到這一點使用任何其他方式:

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

如果返回true,則所有的鍵不爲0,否則所有按鍵均爲0

相關問題