减去具有相同键的两个 python 字典的值

subtract values of two python dictionaries with the same key

我有几本 python 字典

dict1 = {0:[('a',10),('b',11),('c',12)],1:[('a',12),('b',15),('c',16)]}
dict2 = {0:[('a',13),('b',15),('c',12)],1:[('a',12),('b',18),('c',20)]}

我正在尝试查看元组的值是否有增加。

即dict1(a,10) dict2(a,13),所以增加了3,结果

预期输出:

dict3 = {0: ('a',3),('b',4),1:('b',3),('c',4)}

我的代码


dict3 = {}
for (k,v), (k2,v2) in zip(dict1.items(),dict2.items()):
    for va1,va2 in zip(v,v2):
        if abs(int(va1[1])-int(va2[1]) !=0):
            dict3[k] = ((va1[0],abs(int(va1[1])-int(va2[1]))))

但是正在被覆盖

{0: ('b', 4), 1: ('c', 4)}

dict3[k] = ((va1[0],abs(int(va1[1])-int(va2[1])))) 中,您每次迭代都会覆盖该值,您需要将新值添加到现有值中。您可以使用 get 将空列表作为默认值

diff = abs(int(va1[1]) - int(va2[1]))
if diff != 0:
    dict3[k] = dict3.get(k, []) + [(va1[0], diff)]

输出:

{0: [('a', 3), ('b', 4)], 1: [('b', 3), ('c', 4)]}

您忘记在输出中创建列表结构,因此您只是用每个新元素覆盖 dict3 值,而不是在列表中创建新项目。

这是使用字典理解的替代方法

dict1 = {0:[('a',10),('b',11),('c',12)],1:[('a',12),('b',15),('c',16)]}
dict2 = {0:[('a',13),('b',15),('c',12)],1:[('a',12),('b',18),('c',20)]}

out = {k: [(a, abs(b2-b)) for i, (a ,b) in enumerate(l)
           if (b2:=dict2[k][i][1]) != b]  # walrus operator (python ≥ 3.8)
       for k,l in dict1.items()}

输出:

{0: [('a', 3), ('b', 4)], 1: [('b', 3), ('c', 4)]}