2016-08-28 2 views
-1

У меня есть список кортежей:Как суммировать список кортежей?

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

Я хочу, чтобы получить сумму обоих значений a и b. Результаты должны быть в таком формате:

[ { '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 по Googling либо в заголовке вопроса. –

ответ

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 в)

Смежные вопросы