解題思路詳解

習題: 將以下字典扁平化,輸出爲 target 字典格式

a = {'a': {'b': 1, 'c': 2}, 'd': {'e': 3, 'f': {'g': 4}}}

target = {'a.b': 1, 'd.f.g': 4, 'd.e': 3, 'a.c': 2}

做題思路: 想要構造字典扁平化需要考慮三點 :

1. 字典的遍歷;想要拿到字典中所有的keys 、 values 的值 就需要對完整字典進行一次遍歷,提取到內部字典的k,v實現方式:

a = {'a': {'b': 1, 'c': 2},'d':{'e': 3, 'f': {'g': 4}}}

for keys,values in a.items():

        print(keys,values)

if isinstance (values,dict):

for keys,values in values.items():

print(values)

if isinstance(values,dict):

通過這段代碼 可以得到結論 我想要提取全部的keys 、values 的值就需要做一個循環的遍歷 ,而且遍歷的都是上一次得到的結果,由此可以簡化爲一個遞歸函數的形式.

 def dictsolve(a):

     for k,v in a:

if isinstance(v,dict):

      dictsolve(v)

else :

    print(v)  

2. 構造題目要求的輸出模型,題目要求需要最後輸出扁平化的字典模型 target = {'a.b': 1, 'd.f.g': 4, 'd.e': 3, 'a.c': 2}  所以我們需要把提取出的內容放到一個地方,所以我需要提前構造一個空字典來存放提取到的值。所以在原有基礎上需要構造字典.

target = { }

def dictsolve(a):

    for k,v in a:

if isinstance(v,dict):

    dictsolve(v)

else :

    print(v)

字典構建好後,要利用函數輸出的話,那就要對函數進行一下改造,通過閱讀函數可以得出結論在else中通過修改打印結果來實現對字典扁平化的實現;模板如下:

    target = { }

    def dictsolve(a):

             for k,v in a:

                 if isinstance(v,dict):

                dictsolve(v)

         else :

                 target[k]=v

            3.通過運行上一行代碼查看顯示結構

target = { }

def dictsolve(a):

    for k,v in a.items():

        if isinstance(v,dict):

    dictsolve(v)

else :

    target[k]=v

輸出爲 dictsolve(a ={'a': {'b': 1, 'c': 2}, 'd': {'e': 3, 'f': {'g': 4}}})

print(target)

{'b': 1, 'c': 2, 'e': 3, 'g': 4}

通過與題目要求比較發現,輸出結果少了一部分這是由於函數在執行中沒有利用k值,在else中應該傳入的k的值是有函數if在遞歸過程中一步一步迭代而來所取到的k的值,所以我們就要想辦法構造一個迭代的k輸入給target[迭代k]=v;因此我們可以採用在函數定義是給一個空{},用來迭代函數運行時產生的k,具體步驟如下:

        target = {}

def dictsolve(a,b=" "):

    for k,v in a:

if isinstance (v,dict):

dictsolve(v,b=b+"k"+".")

else :

        target[b + k ] = v


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章