按键列表中存储为键值对的元组的总和值

时间:2016-07-13 04:54:24

标签: python list sum tuples

我有一个像[('a',2),('a',3),('b',3),('c',2),('b',4)]

这样的列表

我想总结所有类似的密钥,并以任何顺序得到[('a',5),('c',2),('b',7)]都没问题。

有没有更好的方法来做这个而不是使用字典。最好使用列表推导,例如[i for j in a for ...]

>>> a = [('a',2),('a',3),('b',3),('c',2),('b',4)]
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for i,j in a:
...   d[i] += j 
... 
>>> d
defaultdict(<type 'int'>, {'a': 5, 'c': 2, 'b': 7})
>>> zip(d.keys(),d.values())
[('a', 5), ('c', 2), ('b', 7)]

在Python-3中,最后一行需要list(zip(d.keys(),d.values()))

1 个答案:

答案 0 :(得分:7)

这在列表理解中可以选择itertools.groupby,但是你的方法似乎很好,并且总是使用列表推导没有固有的好处。恕我直言,在没有进一步问题的情况下对一两行代码进行研究是徒劳的。如果您希望进一步添加任何计数,将此结果维护为字典而不是列表也是有意义的 - 字典是更合适的结构。

使用itertools.groupby方法,您将根据第一个元组元素对已排序的组进行求和。

from itertools import groupby
from operator import itemgetter

my_list = [('a',2),('a',3),('b',3),('c',2),('b',4)]
first = itemgetter(0)
sums = [(k, sum(item[1] for item in tups_to_sum))
        for k, tups_to_sum in groupby(sorted(my_list, key=first), key=first)]

<强>输出

[('a', 5), ('b', 7), ('c', 2)]

这显然也可以起作用(,也许更适合)作为字典理解

{(k, sum(item[1] for item in tups_to_sum))
            for k, tups_to_sum in groupby(sorted(my_list, key=first), key=first)}