习题: 将以下字典扁平化,输出为 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