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

2024-04-24 09:12:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 方法infromimport列表for字典顺序
1条回答
网友
1楼 · 发布于 2024-04-24 09:12:49

这在列表理解中与^{}交替使用是可行的,尽管您的方法似乎很好,并且始终使用列表理解没有固有的好处。IMHO,在没有其他问题的情况下再多写一两行代码是一种徒劳的冒险。如果您希望进一步添加任何计数,那么将此结果保存为字典而不是列表也是有意义的—字典是更合适的结构。在

使用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)]

输出

^{pr2}$

显然,这也可以作为字典理解的工具(,也许更适合

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

相关问题 更多 >