簡體   English   中英

從python中的平面字典創建嵌套字典的通用方法

[英]Generic way to create nested dictionary from flat dictionary in python

我正在尋找一種通用的方式來轉換像這樣的扁平字典:

{
    "det_0_prod_di_0_field" : "value", 
    "det_0_prod_di_0_adi_0_field" : "value", 
    "det_0_prod_di_0_adi_1_field" : "value", 
    "det_1_prod_di_0_field" : "value", 
    "det_1_prod_di_0_adi_0_field" : "value", 
    "det_1_prod_di_0_adi_1_field" : "value", 
}

變成這個:

[
    {
        "det" : {
            "prod" : [{
                "di" : {
                    "field" : "value", 
                    "adi" : [{"field" : "value"}, {"field" : "value"}]
                }, 
            }]
        }, 
        "det" : {
            "prod" : [{
                "di" : {
                    "field" : "value", 
                    "adi" : [{"field" : "value"}, {"field" : "value"}]
                }, 
            }]
        }
    }
]

請注意,我必須為“重復”的項目創建字典列表。此外,它必須是通用的,因為每次出現“ _0”,“ _ 1”等時,它都可以具有許多“嵌套級別” ...在密鑰中,應該創建一個列表...

謝謝!

顯然,第一步是將每個鍵分為幾個部分:

target = {}
for key, value in source.items():
    components = key.split('_')

現在,您如何處理這些組件? 從左到右瀏覽每個集合,跟蹤當前集合以及指向下一個集合的索引或鍵,並在此過程中創建所有丟失的子集合。

您尚未指定什么規則算作索引與鍵,規則被跳過或出現順序混亂,索引和鍵都位於同一前綴下會發生什么情況等等。我將為每個選擇一些任意規則-只需將每個組件視為鍵,因為這樣可使代碼最短。 顯然,這不是您想要的規則,但是,如果您了解代碼,則應該能夠對其進行適當的修改; 如果不是,則在使用前需要了解它。

    subtarget = target
    for component in components[:-1]:
        subtarget = subtarget.setdefault(component, dict())
    subtarget[components[-1]] = value

如果您了解該代碼但不知道如何適應它,則可能必須查找int函數, try語句或list.insert方法。

您可能會考慮遵循並使用formencode的方法將結構序列化為平面名稱,然后再讀回它們。

http://www.formencode.org/en/latest/modules/variabledecode.html#module-formencode.variabledecode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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