习题: 将以下字典扁平化,输出为 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
转载于:https://blog.51cto.com/12950054/2164564