我有一个像 [('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()))
请您参考如下方法:
这对于 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)}
