25

这里的第一个问题,所以我会马上回答:

使用 python 2.7

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

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

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

我的第一个想法是迭代项目并测试每个项目,同时保持对每个 True 值或其他内容的计数。我只是想知道,因为我还是 python 新手并且不知道所有的库,是否有更好/更快/更简单的方法来做到这一点。

提前致谢。

4

2 回答 2

36

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

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. 聪明并不总是更好。我认为大多数人会认为这个版本比上面的版本更晦涩(因此更糟)。

于 2012-11-19T21:16:25.857 回答
11

如果您想要一个可以快速访问以检查计数的数据结构,您可以尝试使用 Counter (正如@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
于 2012-11-19T21:17:46.477 回答