如何根据列表值获取两个词典之间的差异?

时间:2017-07-13 16:59:13

标签: python dictionary comparison difference

假设你有字典A和B:

A = {'a':[5, 3], 't':[4], 'd':[2, 5, 6]}
B = {'s':[11,5], 'a':[4,6], 'd':[0, 6, 3]}

如何在新词典中获得A和B值之间的差异? 差异意义A - B =>例如,对于' a'关键是[5,3] - [4,6]结果是[1,-3]

2 个答案:

答案 0 :(得分:3)

我认为你的意思是A - B,而且只在key中存在。这些是很多假设,但你的问题有点模糊......

这个怎么样:

A = {'a':[5, 3], 't':[4], 'd':[2, 5, 6]}
B = {'s':[11,5], 'a':[4,6], 'd':[0, 3]}

C = {k: [x - y for x, y in zip(v, B[k])] for k, v in A.items() if k in B}
print(C)  # {'d': [2, 2], 'a': [1, -3]}

如果您不关心key是否存在于两者中,并希望简单地“减去”#34; B.get()zip_longest from itertools一起使用默认参数0,如下所示:

from itertools import zip_longest
C = {k: [x - y for x, y in zip_longest(v, B.get(k, []), fillvalue=0)] for k, v in A.items()}
print(C)  # {'a': [1, -3], 'd': [2, 2, 6], 't': [4]}

答案 1 :(得分:1)

这个怎么样?它会添加A中缺少的B中的任何值,如果密钥没有丢失,则从A中的值之和中减去B中值的总和:

A = {'a':[5, 3], 't':[4], 'd':[2, 5, 6]}
B = {'s':[11,5], 'a':[4,6], 'd':[0, 3]}

def merge_and_differences(d1,d2):
    d3 = d1.copy()
    for k,v in d2.items():
        if k not in d3:
            d3[k] = v
        else:
            d3[k] = sum(d3[k]) - sum(d2[k])
    return d3

C = merge_and_differences(A,B)

print (C)

结果:

{'a': -2, 's': [11, 5], 't': [4], 'd': 10}