合并两个列表:聚合具有相似键的值

0 投票
4 回答
1822 浏览
提问于 2025-04-15 14:48

我有两个列表,或者说有多个列表,内容大概是这样的:

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

撰写回答