消除重复并在列表中汇总相应的术语

时间:2010-11-03 05:03:23

标签: python list-comprehension itertools

鉴于这两个清单

L2 = [A,B,C,D,A,B]
L3 = [3,2,1,2,2,1]

我想获得

L2_WANTED = [A,B,C,D]
L3_WANTED = [5,3,1,2]

列表总是有序且大小相同,元素对应作为键值对,例如A:3,B:2等等。

目标是消除L2中的重复并将L3中的相应项相加以获得具有匹配对的新列表。这是为了在项目添加到列表时保留正在运行的项目列表。

我尝试用index编写一个函数,但它开始变得难看。我查了itertools但找不到任何相关内容;我查看了starmap()但无法使其正常工作。也许这可以通过列表理解来完成。我很感激有关如何实现这种最简单方法的任何线索或方向。谢谢。

修改

@SimonC:

>>> l2_sum = {}
>>> for i in range(0, len(L2)):
        key = L2[i]
        num = L3[i]
        l2_sum[key] = l2_sum.get(key, 0) + num


>>> l2_sum
{'A': 5, 'C': 1, 'B': 3, 'D': 2}
>>>

这如何消除欺骗并添加数字?你能给出一个线索吗?谢谢。

3 个答案:

答案 0 :(得分:2)

我相信那里会有更优雅的答案,并会在回复中提及。

但是对于一些简单的答案:

L2 = ['A','B','C','D','A','B']
L3 = [3,2,1,2,2,1]

L4 = zip(L2, L3)

L5 = []
L6 = []
def freduce(l):
    for x, y in l:
        print x , y
        if x in L5:
            k = L5.index(x)
            L6[k] += y
        else:
            L5.append(x)
            L6.append(y)

freduce(L4)  
print L5
print L6

输出:

['A', 'B', 'C', 'D']
[5, 3, 1, 2]

[理解第二次实施的编辑答案]

>>> L3 = [3,2,1,2,2,1]
>>> L2 = ['A','B','C','D','A','B']
>>> range(0, len(L2))
[0, 1, 2, 3, 4, 5]
>>> 

因此,对于范围内的i(0,len(L2)):... i成为索引

使用此索引,您可以通过执行以下操作从L3和L2中提取信息:

key = L2[i]
num = L3[i]

然后您将信息添加到词典

l2_sum[key] = l2_sum.get(key, 0) + num

这里l2_sum.get(key,0)如果键不存在则返回0,否则返回当前值。

我希望它足够清楚。

答案 1 :(得分:2)

我认为使用zip是组合列表的好方法。 dict.update部分将进行求和,因为我获取前一个值并更新它:

foo = dict()
for x, y in zip(['A', 'B', 'C', 'D', 'A', 'B'],
                [3, 2, 1, 2, 2, 1]):
    foo[x] = y + foo.get(x, 0)

print foo

输出: {'A': 5, 'C': 1, 'B': 3, 'D': 2}

编辑:

虽然以上情况很好,但我也考虑使用itertools.izip,它允许您在构建字典时执行zip。这样你就可以节省内存。您需要做的就是在导入zip后将itertools.izip替换为iterools

答案 2 :(得分:1)

这样做,但根据pyfunc,有更好的方法:

l2_sum = {}
for i in range(0,len(L2)):
    key = L2[i]
    num = L3[i]
    l2_sum[key] = l2_sum.get(key, 0) + num

L2_WANTED = sorted(l2_sum.keys())
L3_WANTED = [l2_sum[key] for key in L2_WANTED]