如何以 Python 方式以故障安全方式将内容从一个字典映射到另一个字典?
How to Pythonically map content from one dict to another in a fail safe manner?
我从 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
的整个创建包装到 try/except
中,但是如果其中一个初始字段不存在,它将失败。
除了为我添加到 new_dict
的每个字段创建一个 try/except
之外,没有其他方法吗?实际上字典比这个大得多(大约 400 key/value 对),所以这很快就会变得一团糟。
难道没有更好更 pythonic 的方法吗?
使用 dict.get
怎么样?如果键不在字典中,则此 returns 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)
我从 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
的整个创建包装到 try/except
中,但是如果其中一个初始字段不存在,它将失败。
除了为我添加到 new_dict
的每个字段创建一个 try/except
之外,没有其他方法吗?实际上字典比这个大得多(大约 400 key/value 对),所以这很快就会变得一团糟。
难道没有更好更 pythonic 的方法吗?
使用 dict.get
怎么样?如果键不在字典中,则此 returns 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)