我正在努力从字典记录中动态提取值,我希望有人能提供帮助。
这是我从系统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')])
任何帮助或建议,我们将不胜感激!谢谢。
答案 0 :(得分:0)
您的问题还不清楚。特别是涉及到您将要输入的内容时。因此,下面的答案适用于您提供的输入,但是您可能需要根据您的需要调整条件,分割和其他方面。
您的输入:
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')])
答案 1 :(得分:0)
遍历字典,测试该值是否是字典,如果它在内部并追加。
temp = OrderedDict()
for key,value in dict_name:
if isinstance(value,dict):
temp.update(value)
dict_name.update(temp)
您将其中的字典解压缩为新的OrderedDict,并将其添加到原始OrderedDict
答案 2 :(得分:0)
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')])