计算python字典中某个值出现的次数?

新手上路,请多包涵

如果我有这样的东西:

 D = {'a': 97, 'c': 0 , 'b':0,'e': 94, 'r': 97 , 'g':0}

例如,如果我想计算“0”的出现次数作为一个值而不必迭代整个列表,这是否可能以及如何实现?

原文由 RowanX 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 554
2 个回答

本答案 中所述,使用 operator.countOf() 是可行的方法,但您也可以在 sum() 函数中使用生成器,如下所示:

 sum(value == 0 for value in D.values())
# Or the following which is more optimized
sum(1 for v in D.values() if v == 0)

或者作为一种稍微更优化和更实用的方法,您可以使用 map 函数,方法是将整数的 __eq__ 方法作为构造函数传递。

 sum(map((0).__eq__, D.values()))

基准:

 In [15]: D = dict(zip(range(1000), range(1000)))

In [16]: %timeit sum(map((0).__eq__, D.values()))
49.6 µs ± 770 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [17]: %timeit sum(v==0 for v in D.values())
60.9 µs ± 669 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [18]: %timeit sum(1 for v in D.values() if v == 0)
30.2 µs ± 515 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [19]: %timeit countOf(D.values(), 0)
16.8 µs ± 74.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

请注意,虽然在这种情况下使用 map 函数可能更优化,但为了对这两种方法有更全面和一般的了解,您还应该为相对较大的数据集运行基准测试。然后,您可以根据您拥有的数据结构和数量使用最合适的方法。

原文由 Mazdak 发布,翻译遵循 CC BY-SA 4.0 许可协议

或者,使用 collections.Counter

 from collections import Counter
D = {'a': 97, 'c': 0 , 'b':0,'e': 94, 'r': 97 , 'g':0}

Counter(D.values())[0]
# 3

原文由 blacksite 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏