簡體   English   中英

將扁平字典轉換為嵌套字典

[英]Convert flattened dictionary to nested dictionary

這是我的扁平化字典:

d={"QR": "", "Customer Details": "",
 "feature prompt": "something", "chain": "lee", "store": "levis"}

我想要 output 作為嵌套字典; 每個空字符串值代表一個新字典的開始。 所需的 output:

{
    "QR": {
        "Customer Details": {
            "feature prompt": "something",
            "chain": "lee",
            "store": "levis"
        }
    }
}

我的代碼:

d={"QR": "", "Customer Details": "",
 "feature prompt": "something", "chain": "lee", "store": "levis"}

def nest_dict(d):
    result={}
    for k,v in d.items():
        split(k,v,result)
        #print(k)
        #print(v)
    return result

def split(k,v,out):
    if v=='':
        split(k,v,out.setdefault(k,{}))
    else:
        out[k]=v

nest_dict(d)

但是,這給了我一個RecursionError

Traceback (most recent call last):
  File "/Users/asmita/so_test/test.py", line 18, in <module>
    print(nest_dict(d))
  File "/Users/asmita/so_test/test.py", line 7, in nest_dict
    split(k,v,result)
  File "/Users/asmita/so_test/test.py", line 14, in split
    split(k,v,out.setdefault(k,{}))
  File "/Users/asmita/so_test/test.py", line 14, in split
    split(k,v,out.setdefault(k,{}))
  File "/Users/asmita/so_test/test.py", line 14, in split
    split(k,v,out.setdefault(k,{}))
  [Previous line repeated 994 more times]
  File "/Users/asmita/so_test/test.py", line 13, in split
    if v=='':
RecursionError: maximum recursion depth exceeded in comparison

迭代解決方案

您的split方法在無限循環中調用自身,這會導致RecursionError 為此,您實際上根本不需要遞歸。 只需保留對當前“層”的引用,並在每次需要添加新字典時重新分配它。

d = {
    'QR': '',
    'Customer Details': '',
    'feature prompt': 'something',
    'chain': 'lee',
    'store': 'levis',
}

def nest_dict(flat_dict):
    current_level = result = {}

    for key, value in flat_dict.items():
        if value:
            current_level[key] = value
        else:
            current_level[key] = {}
            current_level = current_level[key]

    return result

print(nest_dict(d))

Output:

{'QR': {'Customer Details': {'feature prompt': 'something', 'chain': 'lee', 'store': 'levis'}}}

遞歸解法

如果你確實想使用遞歸,你可能希望你的主 function 調用自己,而不是委托給第二個 function 來調用它自己。 在此實現中,當您遇到空白值時,function 會調用自身,為子調用提供一個刪除了當前鍵的字典版本(然后中斷其循環,因此它不會對每個后續鍵進行雙重處理)。

def nest_dict(flat_dict):
    result = {}

    for key, value in flat_dict.items():
        if value:
            result[key] = value
        else:
            result[key] = nest_dict(
                {k:v for k, v in flat_dict.items() if k != key}
            )
            break

    return result

注意事項

遞歸編程有兩個主要缺陷:

  • 全神貫注並正確實施可能很棘手,尤其是對於編程初學者而言。
  • Python,在幕后,並沒有真正針對遞歸進行優化,並且如您所見,深度迭代太多層將導致RecursionError (以防止堆棧溢出)。

第二個問題不太可能成為這里的一個因素,除非你的字典真的很大; 遞歸限制通常設置為 1,000 首先,您的里程可能會有所不同。 如果不出意外,嘗試一下會很有趣!

暫無
暫無

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

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