这里的第一个问题,所以我会正确的:
使用python 2.7
我有一个项目字典,键是一个x,y坐标,表示为元组:(x,y),所有值都是布尔值。
我正在试图找出一种快速而简洁的方法来计算有多少项具有给定值。我不需要知道哪些键具有给定值,只需要知道多少。
这里有类似的帖子: How many items in a dictionary share the same value in Python,但我不需要返回字典,只需要一个整数。
我的第一个想法是迭代这些项目并测试每一项,同时保持每个True值的计数。我只是想知道,因为我还是陌生的新手并且不了解所有的库,如果有更好/更快/更简单的方法来做这件事。
提前感谢。
答案 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