Python 如何以故障安全的方式将内容从一个dict映射到另一个dict?

Python 如何以故障安全的方式将内容从一个dict映射到另一个dict?,python,dictionary,mapping,try-except,Python,Dictionary,Mapping,Try Except,我从一个api得到了一条命令: initial_dict = { "content": { "text": }, "meta": { "title": "something", "created": "2016-03-04 15:30", "author": "Pete", "extra": { "a": 123, "b": 456

我从一个api得到了一条命令:

initial_dict = {
    "content": {
        "text":
    },
    "meta": {
        "title": "something",
        "created": "2016-03-04 15:30",
        "author": "Pete",
        "extra": {
            "a": 123,
            "b": 456
        }
    }
}
我需要把这个映射到另一个dict:

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']
    }
}
问题是并非所有字段都始终在初始目录中。当然,我可以将整个
新建目录的创建过程包装成
try/except
,但如果其中一个初始字段不存在,那么它将失败

除了为我添加到
新目录中的每个字段创建一个
try/except
,没有别的方法了吗?实际上,dict要比这个大得多(大约400个键/值对),所以很快就会变得一团糟

难道没有更好、更像蟒蛇的方法吗?

使用如何?如果键不在字典中,则返回
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')
    }
}
如果这比一个级别更深,您可以按照注释中的建议执行
一些dict.get('key1',{}).get('key2')

将原始dict转换为
defaultdict
也是一个选项,它允许您继续使用
[]
表示法(比必须链接
get
方法更实用):

然后可以过滤掉
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)
使用如何?如果键不在字典中,则返回
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')
    }
}
如果这比一个级别更深,您可以按照注释中的建议执行
一些dict.get('key1',{}).get('key2')

将原始dict转换为
defaultdict
也是一个选项,它允许您继续使用
[]
表示法(比必须链接
get
方法更实用):

然后可以过滤掉
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)

创建一个列表,其中每个条目都是from和to键,在一次尝试中循环使用它们/except@barny-听起来是个好主意,但我不确定如何构建这样的东西。您是否有一些示例代码?您可以使用
initial\u dict.get('meta',dict()).get(key)
。通过在第一次调用
get
时默认设置为
dict()
,您将消除出现错误的可能性
maplist=[['fromkey1'、'fromkey2'、'tokey1'、'tokey2'];对于映射列表中的映射:newdict[mapping[0]][mapping[1]]=initial_dict[mapping[3]][mapping[4]]
显然,您还必须查找键2是否为None,在这种情况下,只能使用一级字典访问。@gtlambert:see。创建一个列表,其中每个条目都是from和to键,在一次尝试中循环通过这些/except@barny-听起来是个好主意,但我不确定如何构建这样的东西。您是否有一些示例代码?您可以使用
initial\u dict.get('meta',dict()).get(key)
。通过在第一次调用
get
时默认设置为
dict()
,您将消除出现错误的可能性
maplist=[['fromkey1'、'fromkey2'、'tokey1'、'tokey2'];对于映射列表中的映射:newdict[mapping[0]][mapping[1]]=initial_dict[mapping[3]][mapping[4]]
显然,您还必须查找键2是否为None,在这种情况下,仅使用一级字典访问。@gtlambert:请参阅。