2016-08-28 31 views
-1

我有元组的列表:如何对元组列表进行求和?

[ (a,1), (a,2), (b,1), (b,3) ] 

我想要得到的ab值两者的总和。结果应采用以下格式:

[ { 'key' : a, 'value' : 3 }, {'key' : b, 'value' : 4 } ] 

我该怎么做?

+1

你有没有看[计数器](https://docs.python.org/3.5/library/collections.html#collections.Counter)从'collections'。 –

+0

[Python中的组字典键值]的可能重复(http://stackoverflow.com/questions/18180145/group-dictionary-key-values-in-python) –

+1

大约与您解决的方式相同[您的其他问题](https://stackoverflow.com/questions/39194126/how-to-group-by-list-of-dict-by-key)上的一个非常类似的话题,数据呈现略有不同。您也可以在StackOverflow上通过搜索问题标题找到此解决方案。 –

回答

1
from itertools import groupby 
[{'key': k, 'value': sum(v for _,v in g)} for k, g in groupby(sorted(lst), key = lambda x: x[0])] 

# [{'key': 'a', 'value': 3}, {'key': 'b', 'value': 4}] 
1
from collections import defaultdict 

lst = [("a", 1), ("a", 2), ("b", 1), ("b", 3)] 

out = defaultdict(list) 
[out[v[0]].append(v[1]) for v in lst] 
out = [{"key": k, "value": sum(v)} for k, v in out.iteritems()] 

print out 
0
from collections import Counter 

a = [('a', 1), ('a', 2), ('b', 1), ('b', 3)] 
c = Counter() 
for tup in a: 
    c = c + Counter(dict([tup])) 
0

您可以使用collections.Counter从初始列表创建multiset,然后修改结果,以配合您的情况:

from collections import Counter 

lst = [('a', 1), ('a', 2), ('b', 1), ('b', 3)] 

part = sum((Counter({i[0]: i[1]}) for i in lst), Counter()) 
# Counter({'b': 4, 'a': 3}) 

final = [{'key': k, 'value': v} for k, v in part.items()] 
# [{'key': 'b', 'value': 4}, {'key': 'a', 'value': 3}] 
1

非常相似,已经给出答案。稍微长一些,但更容易阅读,恕我直言。

from collections import defaultdict 

lst = [('a', 1), ('a', 2), ('b', 1), ('b', 3)] 

dd = defaultdict(int) 
for name, value in lst: 
    dd[name] += value 

final = [{'key': k, 'value': v} for k, v in dd.items()] 

(从摩西Koledoye的答案复制最后一行)

相关问题