在多个嵌套的python词典上执行计算

时间:2019-06-05 21:54:39

标签: python dictionary

尝试通过比较两个大小相似的嵌套字典并减去最低嵌套字典的最后一个值来创建字典理解。词典中仅包含值!= 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}}

1 个答案:

答案 0 :(得分:1)

您的变量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"