尝试通过比较两个大小相似的嵌套字典并减去最低嵌套字典的最后一个值来创建字典理解。只有值!= 0将包含在字典中。
d1 = {1: {'a':10,'b':20,'c':10}}
d2 = {1: {'a':30,'b':40,'c':10}}
matchKeys = d1.keys() & d2.keys()
new = {}
for k in matching_keys:
if not d1[k] == d2[k]:
for d1_key, d1_value in d1[k].items():
for d2_key, d2_value in d2[k].items():
new[k][d2_key] = (d2_value-d1_value)
还尝试了:
d3 = {k: {d2_key:(d2_value-d1_value) for d2_key, d2_value in d2.items()} for d1_key, d1_value in d1[k].items() for k in matching_keys if not d1[k] == d2[k]}
我期待着:
d3 = {1: {'a':20,'b':20}}
发布于 2019-06-06 06:11:50
您的变量matchkeys
仅保存字典的第一级上的键。当你进入字典时,你需要得到每一级的关键字。将其视为递归函数可能更容易一些。然后,您可以只将嵌套的语句传递回函数。
类似于:
d1 = {1: {'a':10,'b':20,'c':10}}
d2 = {1: {'a':30,'b':40,'c':10}}
def filterDifs(d1, d2):
d = {}
matchKeys = d1.keys() & d2.keys()
for k in matchKeys:
if isinstance(d1[k], dict) and isinstance(d2[k], dict):
d[k] = filterDifs(d1[k], d2[k])
else:
try:
if d1[k] - d2[k] != 0:
d[k] = d1[k] - d2[k]
except TypeError:
pass
return d
filterDifs(d1, d2)
结果:
{1: {'b': -20, 'a': -20}}
这将忽略减去不兼容类型的尝试,但如果您想在这些情况下添加某种值,您可以在except
块中:
except TypeError:
d[k] = "Some error value"
https://stackoverflow.com/questions/56468547
复制相似问题