在多个嵌套python字典上执行计算
试图通过比较两个大小相似的嵌套字典并减去最低嵌套字典的最后一个值来创建dict理解。仅限值!=0将包含在词典中在多个嵌套python字典上执行计算,python,dictionary,Python,Dictionary,试图通过比较两个大小相似的嵌套字典并减去最低嵌套字典的最后一个值来创建dict理解。仅限值!=0将包含在词典中 d1 = {1: {'a':10,'b':20,'c':10}} d2 = {1: {'a':30,'b':40,'c':10}} matchKeys=d1.keys()&d2.keys() 还尝试: d3 = {k: {d2_key:(d2_value-d1_value) for d2_key, d2_value in d2.items()} for d1_key, d1_valu
d1 = {1: {'a':10,'b':20,'c':10}}
d2 = {1: {'a':30,'b':40,'c':10}}
matchKeys=d1.keys()&d2.keys()
还尝试:
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}}
您的变量
matchkeys
仅保存DICT第一级上的键。您需要在进入字典时获取每个级别的键。将其视为递归函数可能更容易。然后您可以将嵌套的dict传递回函数
比如:
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"
你说“相似”而不是“相同”。所以,如果d1={1:{a':10,'b':20,'c':10}}}d2={1:{a':30,'b':40,'c':10}}是
d1={1:{a':10,'b':20,'c':10}}d2={1:{a':30,'b':40,}
,这仍然有效吗?我只是想澄清一下。你现在得到的澄清dict的输出是什么?除了底层字典中的嵌套值之外,其他所有输出都是相同的。dict comprehension抱怨将(d2_value-d1_value)赋值给d2_键时抛出了一个typeerror。我注意到这个解决方案是,如果所有的嵌套值都相等,它仍然返回一个具有更高级别键和空值的字典。如果所有值都相等,函数怎么能简单地返回None?将return语句替换为return{key:val for key,val in diff.items()if val}
except TypeError:
d[k] = "Some error value"