2012-11-19 37 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