[英]How to merge list of tuples
我有两个这样的元组列表:
x1 = [('A', 3), ('B', 4), ('C', 5)]
x2 = [('B', 4), ('C', 5), ('D', 6)]
我想将两个列表合并为一个新的 x3,以便添加列表中的值。
x3 = [('A', 3), ('B', 8), ('C', 10),('D',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)]
既然你标记了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)]
>>> 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 ,即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。
我认为以下代码有效
dict_x1=dict(x1)
for item in x2:
if item[0] in dictx1:
dictx1[item[0]] += item[1]
else:
dictx1[item[0] = item[1]
你也可以用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)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.