首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对多个嵌套的python字典执行计算

对多个嵌套的python字典执行计算
EN

Stack Overflow用户
提问于 2019-06-06 05:54:39
回答 1查看 311关注 0票数 0

尝试通过比较两个大小相似的嵌套字典并减去最低嵌套字典的最后一个值来创建字典理解。只有值!= 0将包含在字典中。

代码语言:javascript
复制
d1 = {1: {'a':10,'b':20,'c':10}}
d2 = {1: {'a':30,'b':40,'c':10}}

matchKeys = d1.keys() & d2.keys()

代码语言:javascript
复制
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)

还尝试了:

代码语言:javascript
复制
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]}

我期待着:

代码语言:javascript
复制
d3 = {1: {'a':20,'b':20}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 06:11:50

您的变量matchkeys仅保存字典的第一级上的键。当你进入字典时,你需要得到每一级的关键字。将其视为递归函数可能更容易一些。然后,您可以只将嵌套的语句传递回函数。

类似于:

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
{1: {'b': -20, 'a': -20}}

这将忽略减去不兼容类型的尝试,但如果您想在这些情况下添加某种值,您可以在except块中:

代码语言:javascript
复制
except TypeError:
    d[k] = "Some error value"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56468547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档