Python 2.7计算具有给定值的字典项的数量

时间:2012-11-19 21:14:47

标签: python dictionary

这里的第一个问题,所以我会正确的:

使用python 2.7

我有一个项目字典,键是一个x,y坐标,表示为元组:(x,y),所有值都是布尔值。

我正在试图找出一种快速而简洁的方法来计算有多少项具有给定值。我不需要知道哪些键具有给定值,只需要知道多少。

这里有类似的帖子: How many items in a dictionary share the same value in Python,但我不需要返回字典,只需要一个整数。

我的第一个想法是迭代这些项目并测试每一项,同时保持每个True值的计数。我只是想知道,因为我还是陌生的新手并且不了解所有的库,如果有更好/更快/更简单的方法来做这件事。

提前感谢。

2 个答案:

答案 0 :(得分:33)

这第一部分主要是为了好玩 - 我可能不会在我的代码中使用它。

sum(d.values())

将获得True值的数量。 (当然,您可以按False)获取len(d) - sum(d.values())值的数量。


稍微更普遍的是,您可以执行以下操作:

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的事实。聪明并不总是更好。我想大多数人会认为这个版本比上面的版本更加模糊(因此更糟糕)。

答案 1 :(得分:9)

如果你想要一个可以快速访问的数据结构来检查计数,你可以尝试使用一个计数器(正如@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