Python:Collections.Counter 与 defaultdict(int)

新手上路,请多包涵

假设我有一些数据如下所示。

 Lucy = 1
Bob = 5
Jim = 40
Susan = 6
Lucy = 2
Bob = 30
Harold = 6

我想结合:

  1. 删除重复的键,和
  2. 添加这些重复键的值。

这意味着我会得到键/值:

 Lucy = 3
Bob = 35
Jim = 40
Susan = 6
Harold = 6

为此使用(来自集合中的)计数器或默认字典会更好吗?

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

阅读 477
2 个回答

Counterdefaultdict(int) 都可以在这里正常工作,但它们之间几乎没有区别:

  • Counter 支持您可以在 多重集 上执行的大部分操作。因此,如果您想使用这些操作,请选择 Counter。

  • Counter 查询丢失的键时不会向字典添加新键。因此,如果您的查询包含字典中可能不存在的键,那么最好使用 Counter

例子:

 >>> c = Counter()
>>> d = defaultdict(int)
>>> c[0], d[1]
(0, 0)
>>> c
Counter()
>>> d
defaultdict(<type 'int'>, {1: 0})

例子:

  • Counter 还有一个名为 most_common 的方法允许您按项目的数量对项目进行排序。要在 defaultdict 中获得相同的内容,您必须使用 sorted

例子:

 >>> c = Counter('aaaaaaaaabbbbbbbcc')
>>> c.most_common()
[('a', 9), ('b', 7), ('c', 2)]
>>> c.most_common(2)          #return 2 most common items and their counts
[('a', 9), ('b', 7)]

  • Counter 还允许您从 Counter 对象创建元素列表。

例子:

 >>> c = Counter({'a':5, 'b':3})
>>> list(c.elements())
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b']

因此,根据您要对结果字典执行的操作,您可以在 Counterdefaultdict(int) 之间进行选择。

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

defaultdict(int) 似乎工作得更快。

 In [1]: from collections import Counter, defaultdict

In [2]: def test_counter():
   ...:     c = Counter()
   ...:     for i in range(10000):
   ...:         c[i] += 1
   ...:

In [3]: def test_defaultdict():
   ...:     d = defaultdict(int)
   ...:     for i in range(10000):
   ...:         d[i] += 1
   ...:

In [4]: %timeit test_counter()
5.28 ms ± 1.2 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [5]: %timeit test_defaultdict()
2.31 ms ± 68.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

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

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