按键分组的两个元组列表中的总和值

时间:2019-02-23 03:57:36

标签: python python-2.7

我有两个元组列表,我想按每个键(键,值)对总数进行分组。

请注意键142。

a = [(1713, 1L), (745, 1L), (142, 1L)]
b = [(1298, 1L), (620, 1L), (142, 1L)]

a_b = [(1713, 1L), (745, 1L), (1298, 1L), (620, 1L), (142, 2L)]

我正在尝试此操作,但是当b中的密钥是新的时,显然会失败:

d={}
for k,v in a:
    for k1,v1 in b:
        if k == k1:
            print k
            d[k] = v+v1
        else:
            d[k] = v
print d #{1713: 1L, 142: 2L, 745: 1L}

4 个答案:

答案 0 :(得分:4)

您可以通过依次遍历collections.OrderedDicta的组合列表来使用b,因为后面的复制键在合并逻辑中具有优先权,之后您就可以通过再次反转字典项列表来获得所需的元组列表:

from collections import OrderedDict
d = OrderedDict()
for k, v in reversed(a + b):
    d[k] = d.get(k, 0) + v
a_b = d.items()[::-1]

a_b变为:

[(1713, 1L), (745, 1L), (1298, 1L), (620, 1L), (142, 2L)]

编辑:由于您现在在注释中提到输出顺序无关紧要,因此可以像在问题中一样使用常规字典。此处的密钥是遍历ab的组合列表,并使用dict.get方法将密钥的初始值默认为0

d = {}
for k, v in a + b:
    d[k] = d.get(k, 0) + v
a_b = d.items()

答案 1 :(得分:1)

Counter非常适合这种情况。基本上,这是一本知道如何加法的字典。

from collections import Counter

a = [(1713, 1L), (745, 1L), (142, 1L)]
b = [(1298, 1L), (620, 1L), (142, 1L)]

a_b = Counter(dict(a)) + Counter(dict(b))
print([(k, v) for k, v in a_b.items()])

您将得到这样的输出

[(1713, 1L), (1298, 1L), (620, 1L), (142, 2L), (745, 1L)]

当然,如果需要进一步处理,您实际上不需要将结果转回元组列表。

答案 2 :(得分:1)

from collections import defaultdict as ddt
from itertools import chain

new_dic = ddt(long)
for k,v in chain(a,b):
    new_dic[k] += v
a_b = new_dic.items()

答案 3 :(得分:0)

没有import的解决方案:

counter = {key : 0 for key, _ in a + b}
for key, val in a + b:
    counter[key] += val
a_b = [(key, val) for key, val in counter.items()]