Python 如何以故障安全的方式将内容从一个dict映射到另一个dict?
我从一个api得到了一条命令: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
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:请参阅。