假设我有一些如下所示的数据。
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
使用(来自集合)计数器或默认字典会更好吗?
答案 0 :(得分:37)
Counter
和defaultdict(int)
在这里都可以正常工作,但它们之间的差异很小:
Counter
支持您在multiset上可以执行的大部分操作。因此,如果您想使用这些操作,请转到计数器。
Counter
不会向dict添加新密钥。因此,如果您的查询包含dict中可能不存在的密钥,那么最好使用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']
因此,根据您对结果字典的处理方式,您可以选择Counter
和defaultdict(int)
。
答案 1 :(得分:2)
我支持使用defaultdict(int)
进行求和计数,例如在这种情况下,使用Counter()
计算列表元素。在您的情况下,以下将是最干净的解决方案:
name_count = [
("Lucy", 1),
("Bob", 5),
("Jim", 40),
("Susan", 6),
("Lucy", 2),
("Bob", 30),
("Harold", 6)
]
aggregate_counts = defaultdict(int)
for name, count in name_count:
aggregate_counts[name] += count
答案 2 :(得分: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)