如何从嵌套字典中动态提取键和值?

时间:2018-07-09 07:58:37

标签: python dictionary nested

我正在努力从字典记录中动态提取值,我希望有人能提供帮助。

这是我从系统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')])

任何帮助或建议,我们将不胜感激!谢谢。

3 个答案:

答案 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')])