如何合并元组列表

时间:2019-01-17 02:27:15

标签: python pandas list

我有两个这样的元组列表:

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 :(得分:6)

您可以创建一个字典,然后遍历每个列表中的值,并添加到字典中每个键的当前值,或者如果当前不存在任何值,则将该值设置为等于当前值。之后,您可以返回列表。

例如:

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

答案 1 :(得分:1)

自从标记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)]

答案 2 :(得分:1)

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

使用groupby和heapq.merge的替代1班轮。

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。

答案 3 :(得分:0)

我认为以下代码有效

dict_x1=dict(x1)
for item in x2:
  if item[0] in dictx1:
    dictx1[item[0]] += item[1]
  else:
    dictx1[item[0] = item[1]

答案 4 :(得分:0)

您也可以使用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)]