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

时间:2009-10-05 08:38:16

标签: python

我有两个或更多的列表。有点像这样:

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中显示或退出。所以结果就像这样

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 个答案:

答案 0 :(得分: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()]

答案 1 :(得分: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()]

答案 2 :(得分:1)

我会说使用字典:

result = {}
for eachlist in (ListX, ListY,):
    for item in eachlist:
        if item[0] not in result:
            result[item[0]] = item

如果您的数据结构不能很好地表示数据,那么执行数据操作总是很棘手。考虑使用更好的数据结构。

答案 3 :(得分:0)

使用字典及其“获取”方法。

d = {}
for x in (listX + listY):
    y       = d.get(x[0], (0, 0, 0))
    d[x[0]] = (x[0], x[1] + y[1], x[2] + y[2])

d.values()