2017-07-25 45 views
0
class MyDict(dict): 
     pass 

def nest_dict(dct): 
    dct = MyDict(dct) 
    for k, v in dct.items(): 
     if isinstance(v, dict): 
      dct[k] = MyDict(v) 
      nest_dict(v) 
    return dct 

dct = {'a':{'b':{'c':'d'}}} 
print(type(nest_dict(dct)['a']['b'])) 

這是我現在擁有的一段代碼。我想要做的是將嵌套字典中的每個子字典轉換爲字典的子類,即MyDict。 但是,我的遞歸邏輯只改變了第一級子字典。如何修改這個遞歸函數?將嵌套字典中的每個子字典轉換爲Python中的defaultdict

+0

一個明顯的缺陷就是裏面,你從來沒有調用'nest_dict()'函數。另外,'pass'拼寫錯誤。另外,'dct ['a'] ['b'] ['c']'是字符串'd'。它不會受到'nest_dict()'的影響。請創建一個簡短,完整的程序,實際運行並實際演示您的問題。將該程序(從不重新輸入)複製粘貼到您的問題以及其實際和希望的輸出中。有關更多信息,請參見[mcve]。 –

回答

0

你不更新您的嵌套結構正確,請嘗試:

def nest_dict(dct): 
    dct = MyDict(dct) 
    for k, v in dct.items(): 
     if isinstance(v, dict): 
      dct[k] = nest_dict(v) 
    return dct 

dct = {'a': {'b': {'c': 'd'}}} 
print(type(dct['a']['b'])) # <class 'dict'> 
my_dct = nest_dict(dct) 
print(type(my_dct['a']['b'])) # <class '__main__.MyDict'> 

雖然我勸你不要延長dict和使用collections.MutableMapping代替。在Python 3.x中,它被移動到collections.abc.MutableMapping

+0

這適用於我。非常感謝。我會嘗試學習MutableMapping。你能否告訴我有關我的解決方案失敗的更多細節? –

0

您可以使用深度優先搜索遍歷dict

class MyDict(dict): 
    pass 

dct = {'a':{'b':{'c':'d'}}} 


def nest_dict(dct): 
    dct = res = MyDict(dct) 
    candidates = [(k, dct) for k in dct] 
    while candidates: 
     k, dct = candidates.pop() 
     if isinstance(dct[k], dict): 
      dct[k] = MyDict(dct[k]) 
      candidates.extend((k_, dct[k]) for k_ in dct[k]) 

    return res 

dct2 = nest_dict(dct) 
0

定義函數dict_to_defaultdict(),該函數環路,通過