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

Python 合并两个列表:聚合具有相似键的值,python,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]) counter = dict( (a[0], (a[1], a[2])) for a in listX

我有两个或两个以上的清单。像这样的事情:

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])
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()]
我想得到这样移动重复元素的结果: 我的结果是从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')
加在一起获得的

谁能帮我解决这个问题。?
谢谢。

如果你使用字典,这很容易

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

我会说使用字典:

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

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

你看起来像字典一样使用列表。你为什么用列表代替字典

我对这个乱七八糟的问题的理解是,您想要在元组中添加值,其中第一个元素在同一个元组中

我会这样做:

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

使用字典及其“get”方法

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

这是不可读的。请格式化文本。请编辑此文本,使其A.)使用语法高亮/编辑器,B.)半清晰。我正在努力理解这个问题。请花一些时间让文本可读。这还不可读。排序在最终列表中重要吗?诅咒,在几秒钟内就让我得到一个非常相似的答案!我花了一段时间才明白,他实际上是在添加值,而不是删除重复项。