2009-10-05 102 views
0

我有两个或更多的列表。有些事情是这样的:合并两个列表:具有相似键的聚合值

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)呈现或exitst在listY.so结果所以是这样

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')一起

获得

任何人都可以解决这个问题。 谢谢。

+0

这是不可读。请格式化文本。 – Ikke 2009-10-05 08:39:23

+0

请把它编辑为A.)使用语法高亮/编辑器和B.)是半清晰的。我很努力去理解 – 2009-10-05 08:39:43

+0

请花点时间让文本可读。 – grigy 2009-10-05 08:41:00

回答

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

谢谢spoonMeiser.it似乎是代码的问题。 – kn3l 2009-11-25 03:35:09

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

诅咒,仅仅几秒钟就让我得到一个非常相似的答案! – SpoonMeiser 2009-10-05 08:49:36

+0

我花了一段时间才明白他实际上是_adding_ values,而不是删除重复项。 – NicDumZ 2009-10-05 10:02:11

1

我会说使用的字典:

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

它总是棘手不要做数据操作,如果你在并不代表数据以及结构有数据。考虑使用更好的数据结构。

+0

感谢您的提示。 – kn3l 2009-11-25 03:38:03

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