我有两个元组列表,我想按每个键(键,值)对总数进行分组。
请注意键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}
答案 0 :(得分:4)
您可以通过依次遍历collections.OrderedDict
和a
的组合列表来使用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)]
编辑:由于您现在在注释中提到输出顺序无关紧要,因此可以像在问题中一样使用常规字典。此处的密钥是遍历a
和b
的组合列表,并使用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()]