如何以一种故障安全的方式将内容从一个词典用Python语言映射到另一个词典?

我从api得到了一个字典:

initial_dict = {
    "content": {
        "text":
    },
    "meta": {
        "title": "something",
        "created": "2016-03-04 15:30",
        "author": "Pete",
        "extra": {
            "a": 123,
            "b": 456
        }
    }
}

我需要将其映射到另一个字典:

new_dict = {
    "content_text": initial_dict['content']['text'],
    "meta_title": initial_dict['meta']['title'],
    "meta_extras": {
        "time_related": {
            initial_dict['meta']['created']
        },
        "by": initial_dict['meta']['author']
    }
}

问题是,并非所有的字段总是在initial_dict中。 当然,我可以将new_dict的整个创建new_dicttry/except ,但如果其中一个初始字段不存在,则它会失败。

除了创建try/except添加到new_dict每个字段try/except ,没有别的办法吗? 实际上,这个词典比这个更大(大约400个键/值对),所以这会变得非常快。

没有一个更好,更pythonic的方式做到这一点?


如何使用dict.get ? 如果键不在字典中,则返回None而不是抛出错误。

new_dict = {
    "content_text": initial_dict['content'].get('text'),
    "meta_title": initial_dict['meta'].get('title'),
    "meta_extras": {
        "time_related": {
            initial_dict['meta'].get('created')
        },
        "by": initial_dict['meta'].get('author')
    }
}

如果这比一个级别更深,你可以按照评论中的建议做some_dict.get('key1', {}).get('key2')

将原始字典转换为defaultdict也是一个选项,它允许您继续使用[]符号(比链接get方法更实用):

from collections import defaultdict
def to_defaultdict(d):
    return defaultdict(lambda: None, ((k, to_defaultdict(v) if isinstance(v, dict) else v)
                                      for k, v in d.items()))
initial_dict = to_defaultdict(initial_dict)

然后,您可以过滤出None值:

def filter_dict(d):
    return dict((k, filter_dict(v) if isinstance(v, dict) else v)
                for k, v in d.items() if v is not None)
new_dict = filter_dict(new_dict)
链接地址: http://www.djcxy.com/p/31703.html

上一篇: How to Pythonically map content from one dict to another in a fail safe manner?

下一篇: What is the difference between implementation of list() and [] in py3.x?