将具有重复键的键值对转换为计数器

时间:2017-04-03 01:26:06

标签: python python-2.7 collections

我在Python 2.7中得到了这个

l = [('a', 1), ('a', 2), ('b', 3), ('b', 4)]

如何获得计数器c:

c = Counter({'a': 3, 'b': 7 }]

如果可能的话,我更愿意使用理解,或者尽可能快地使用理解。

3 个答案:

答案 0 :(得分:1)

只需迭代并添加,Counter自动处理!

In [5]: l = [('a', 1), ('a', 2), ('b', 3), ('b', 4)]
    ...:

In [6]: c = Counter()

In [7]: for k, v in l:
    ...:     c[k] += v
    ...:

In [8]: c
Out[8]: Counter({'a': 3, 'b': 7})

这就是Counter设计使用的方式。

答案 1 :(得分:1)

另一种方法:

>>> from operator import add
>>> reduce(add, map(lambda x: Counter({x[0]: x[1]}), l))
Counter({'b': 7, 'a': 3})

sum

>>> sum(map(lambda x: Counter({x[0]: x[1]}), l), Counter())
Counter({'b': 7, 'a': 3})

答案 2 :(得分:0)

按键排序和分组;将每个键的值相加;添加键:sum(values)到字典。

>>> g = {k:sum(map(value, group)) for k, group in itertools.groupby(a, key = key)}
>>> g
{'a': 3, 'b': 7}
>>> 

setup

你真的不需要收藏。计数器