合并两个列表:聚合具有相似键的值
我有两个列表,或者说有多个列表,内容大概是这样的:
listX = [('A', 1, 10), ('B', 2, 20), ('C', 3, 30), ('D', 4, 30)]
listY = [('a', 5, 50), ('b', 4, 40), ('c', 3, 30), ('d', 1, 20),
('A', 6, 60), ('D', 7, 70])
我想要的结果是把重复的元素处理成这样:我的目标是把listX和listY中的所有元素都拿到,但如果有重复的元素,就要合并它们。
举个例子,假设在listX中有元素('A', 1, 10)
和('D', 4, 30)
,而在listY中也有('A', 6, 60)
,那么最终的结果应该是这样的:
result = [('A', 7, 70), ('B', 2, 20), ('C', 3, 30), ('D', 11, 100),
('a', 5, 50), ('b', 4, 40), ('c', 3, 30), ('d', 1, 20)]
(A, 7, 70)
是通过把('A', 1, 10)
和('A', 6, 60)
加在一起得到的。
有没有人能帮我解决这个问题呢?谢谢。
4 个回答
1
我建议你使用字典:
result = {}
for eachlist in (ListX, ListY,):
for item in eachlist:
if item[0] not in result:
result[item[0]] = item
如果你的数据结构不够好,处理数据就会变得很麻烦。所以,考虑使用更合适的数据结构。
8
如果你用字典的话,这个其实很简单。
combined = {}
for item in listX + listY:
key = item[0]
if key in combined:
combined[key][0] += item[1]
combined[key][1] += item[2]
else:
combined[key] = [item[1], item[2]]
result = [(key, value[0], value[1]) for key, value in combined.items()]
2
你似乎把列表当成字典在用。你为什么不直接用字典呢?
我理解这个有点混乱的问题是,你想把元组中第一个元素相同的值加起来。
我会这样做:
counter = dict(
(a[0], (a[1], a[2]))
for a in listX
)
for key, v1, v2 in listY:
if key not in counter:
counter[key] = (0, 0)
counter[key][0] += v1
counter[key][1] += v2
result = [(key, value[0], value[1]) for key, value in counter.items()]