我有两个这样的元组列表:
x1 = [('A', 3), ('B', 4), ('C', 5)]
x2 = [('B', 4), ('C', 5), ('D', 6)]
我想将两个列表合并为一个新的x3,以便添加列表中的值。
x3 = [('A', 3), ('B', 8), ('C', 10),('D',6)]
您能告诉我我该怎么做吗?
答案 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)
>>> 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)]