![](/img/trans.png)
[英]How to extract a key value pair from a nested dictionary and output it in json
[英]How to dynamically extract key and value from nested dictionary?
我正在努力从字典记录中动态提取值,我希望有人能提供帮助。
这是我的字典记录从系统API看起来的样子。
from collections import OrderedDict
OrderedDict([('Id', '0061J00000QPnGoQAL'),
('Name', 'Acme X-Author RenewalSep tx'),
('Account',
OrderedDict([('Region__c', 'Americas'), ('Name', 'Accenture')])),
('CreatedBy', OrderedDict([('Name', 'Jerret Moz')]))])
我的目标是使字典记录看起来像
OrderedDict([('Id', '0061J00000QPnGoQAL'),
('Name', 'Acme X-Author'),
('Region__c', 'Americas'),
('Name', 'Accenture'),
('Name', 'Jerret Moz')])
如果更理想,但不确定是否可能
OrderedDict([('Id', '0061J00000QPnGoQAL'),
('Name', 'Acme X-Author'),
('Account.Region__c', 'Americas'),
('Account.Name', 'Accenture'),
('CreatedBy.Name', 'Jerret Moz')])
任何帮助或建议,不胜感激! 谢谢。
您的问题还不清楚。 特别是涉及到您将要输入的内容时。 因此,以下答案适用于您提供的输入,但是您可能需要根据您的需要调整条件,分割和其他方面。
您的输入:
from collections import OrderedDict
D = OrderedDict([('Id', '0061J00000QPnGoQAL'),
('Name', 'Acme X-Author RenewalSep tx'),
('Account',
OrderedDict([('Region__c', 'Americas'), ('Name', 'Accenture')])),
('CreatedBy', OrderedDict([('Name', 'Jerret Moz')]))])
如何获得第二个所需的输出:
D2 = OrderedDict()
for key, value in D.items():
if key.lower() == "id":
D2[key] = value
elif key.lower() == "name":
D2[key] = value.split(" RenewalSep tx")[0]
elif type(value) == OrderedDict:
for key2, value2 in value.items():
D2[key + "." + key2] = value2
输出:
OrderedDict([('Id', '0061J00000QPnGoQAL'),
('Name', 'Acme X-Author'),
('Account.Region__c', 'Americas'),
('Account.Name', 'Accenture'),
('CreatedBy.Name', 'Jerret Moz')])
通过dict,测试该值是否为dict,如果在内部并追加。
temp = OrderedDict()
for key,value in dict_name:
if isinstance(value,dict):
temp.update(value)
dict_name.update(temp)
您将其中的字典解压缩到新的OrderedDict中,并将其添加到原始OrderedDict中
def get_dotted_dict(d, old=""):
new = OrderedDict()
for k,v in d.items():
if isinstance(v, dict):
for k2, v2 in v.items():
nk = '.'.join(filter(bool, [old,k,k2]))
new[nk] = get_dotted_form(v2, nk) if isinstance(v2, dict) else v2
else:
new[k] = v
return new
d = OrderedDict([('Id', '0061J00000QPnGoQAL'), ('Name', 'Acme X-Author RenewalSep tx'), ('Account', OrderedDict([('Region__c', 'Americas'), ('Name', 'Accenture')])), ('CreatedBy', OrderedDict([('Name', 'Jerret Moz')]))])
nd = get_dotted_form(d)
print nd
# OrderedDict([('Id', '0061J00000QPnGoQAL'), ('Name', 'Acme X-Author RenewalSep tx'), ('Account.Region__c', 'Americas'), ('Account.Name', 'Accenture'), ('CreatedBy.Name', 'Jerret Moz')])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.