我有一个像[('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()))
答案 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)}