Как объединить список кортежей - PullRequest
0 голосов
/ 17 января 2019

У меня есть два списка таких кортежей:

x1 = [('A', 3), ('B', 4), ('C', 5)]

x2 = [('B', 4), ('C', 5), ('D', 6)]

Я хочу объединить два списка как новый x3, чтобы добавить значения в список.

x3 = [('A', 3), ('B', 8), ('C', 10),('D',6)]

Не могли бы вы показать мне, как я могу это сделать?

Ответы [ 5 ]

0 голосов
/ 17 января 2019

Вы также можете решить эту проблему с помощью itertools

from itertools import groupby
from operator import itemgetter

first = itemgetter(0)
second = itemgetter(1)
res = {}
data = x1 + x2

for _, g in groupby(sorted(data, key=first), key=first):
    group = list(g)
    k = first(first(group))
    v = sum(second(gr) for gr in group)
    res[k] = v

print(sorted(res.items(), key=first))

[('A', 3), ('B', 8), ('C', 10), ('D', 6)]
0 голосов
/ 17 января 2019

Я думаю, что следующий код работает

dict_x1=dict(x1)
for item in x2:
  if item[0] in dictx1:
    dictx1[item[0]] += item[1]
  else:
    dictx1[item[0] = item[1]
0 голосов
/ 17 января 2019

Так как вы помечаете pandas

df1,df2=pd.DataFrame(x1),pd.DataFrame(x2)
pd.concat([df1,df2]).groupby(0,as_index=False).sum().apply(tuple,1).tolist()
[('A', 3), ('B', 8), ('C', 10), ('D', 6)]
0 голосов
/ 17 января 2019

Использование 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.

0 голосов
/ 17 января 2019

Вы можете создать словарь, а затем перебрать значения в каждом списке и либо добавить к текущему значению для каждого ключа в словаре, либо установить значение, равное текущему значению, если в настоящее время значения не существует. После этого вы можете вернуться к списку.

Например:

full_dict = {}
for x in [x1, x2]:
    for key, value in x:
        full_dict[key] = full_dict.get(key, 0) + value # add to the current value, if none found then use 0 as current value

x3 = list(full_dict.items())

Результат для x3:

[('A', 3), ('B', 8), ('C', 10), ('D', 6)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...