簡體   English   中英

如何從嵌套字典中動態提取鍵和值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM