習題: 將以下字典扁平化,輸出爲 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