Skip to main content
 首页 » 编程设计

python之按键将存储为列表中键值对的元组的值求和

2025年05月04日13qq号

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