Использование collections.Counter
>>> x1 = [('A', 3), ('B', 4), ('C', 5)]
>>> x2 = [('B', 4), ('C', 5), ('D', 6)]
>>> from collections import Counter
>>> c1 = Counter(dict(x1))
>>> c2 = Counter(dict(x2))
>>> c3 = c1 + c2
>>> c3.items()
dict_items([('A', 3), ('B', 8), ('C', 10), ('D', 6)])
Просто создайте Counter
для каждого списка, вы можете сделать это, превратив список кортежей в промежуточный диктант. Затем просто добавьте счетчики.
Чтобы вернуть список, просто вызовите метод items счетчика. Технически то, что возвращается, является dict_items
объектом, если действительно важно, что это list
, тогда просто вызовите список на c3.items()
, т.е. list(c3.items())
.
Альтернативный 1 вкладыш, использующий groupby и heapq.merge.
from heapq import merge
from itertools import groupby
from operator import itemgetter
x1 = [('A', 3), ('B', 4), ('C', 5)]
x2 = [('B', 4), ('C', 5), ('D', 6)]
result = [(a, sum(t[1] for t in b)) for a, b in groupby(merge(x1, x2), key=itemgetter(0))]
print(result)
heapq.merge
примерно эквивалентно sorted(itertools.chain(*iterables))
. По сути, он представляет собой отсортированный, объединенный список кортежей, готовый для передачи в groupby.