2012-11-19 42 views
20

第一個問題在這裏,所以我會馬上給它:使用Python 2.7的Python與給定值的字典項2.7計數數量

我有一個項目的字典

,鍵是一個x,y座標表示爲一個元組:(x,y),所有的值都是布爾值。

我想弄清楚一個快速和乾淨的方法來獲得有多少項目有一個給定值的計數。我不需要知道哪些鍵具有給定的值,只是有多少。

還有一個類似的帖子在這裏: How many items in a dictionary share the same value in Python,但是我不需要返回的字典,只是一個整數。

我的第一個想法是迭代項目並測試每個項目,同時保持每個True值的計數。我只是想知道,因爲我還是python的新手,不知道所有的庫,如果有更好/更快/更簡單的方法來做到這一點。

在此先感謝。

回答

30

第一部分主要是爲了好玩 - 我可能不會在我的代碼中使用它。

sum(d.values()) 

將獲得True值的數量。 (當然,您可以通過len(d) - sum(d.values())獲得False值的數量)。


稍微更普遍,你可以這樣做:

sum(1 for x in d.values() if some_condition(x)) 

在這種情況下,if x作品只是代替if some_condition(x)罰款,是大多數人會在現實世界中的代碼使用)

上述三種溶液我已經張貼在這裏,上面是最地道的和是一個我會建議


最後,我想這可能是多一點巧妙地寫着:

sum(x == chosen_value for x in d.values()) 

這是同樣作爲我的第(有趣)的解決方案,因爲它依賴於一個事實,即True + True == 2。聰明並不總是更好。我想大多數人會認爲這個版本比上面的版本更隱晦(因此更糟糕)。

+0

很好。這正是我想要的。 我會upvote,但我不能因爲它的第一篇文章,我沒有代表。我認爲我標記的答案有幫助,雖然:) – jguerra

+0

@RocketDonkey你有一個有效的答案雖然 - 你應該離開它:) –

+0

我仍然更喜歡'總和(1,我在某些東西,如果我)'雖然...(和什麼你是用'== True' @mgilson做的!)!? –

8

如果你想,你可以快速訪問檢查計數的數據結構,你可以嘗試使用一個計數器(如@mgilson指出,這依賴於值本身是可哈希):

>>> from collections import Counter 
>>> d = {(1, 2): 2, (3, 1): 2, (4, 4): 1, (5, 6): 4} 
>>> Counter(d.values()) 
Counter({2: 2, 1: 1, 4: 1}) 

然後你可以插入一個值並得到它出現的次數:

>>> c = Counter(d.values()) 
>>> c[2] 
2 
>>> c[4] 
1