减去具有相同键的两个 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)]}
我有几本 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)]}