把一个字典扁平化,源字典为{‘a’:{‘b’:1,‘c’:2},‘d’:{‘e’:3,‘f’:{‘g’:4}}}
案例一:
src = {‘a’:{‘b’:1,‘c’:2},‘d’:{‘e’:3,‘f’:{‘g’:4}}}
def fn(src,key='',dct={}): #src = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
for k,v in src.items():
newkey = key+k+'.'
if isinstance(v,int):
newkey = newkey.strip('.')
dct[newkey] = v
else:
fn(v,newkey)
return dct
dst = fn(src)
print(dst)
运行结果:
{'a.b': 1, 'a.c': 2, 'd.e': 3, 'd.f.g': 4}
案例二:
source = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
def flatmap(src,dest=None,prefix=''):
if dest == None:
dest = {}
for k,v in src.items():
if isinstance(v,(list,tuple,set,dict)):
flatmap(v,dest,prefix=prefix+k+'.') #递归调用
else:
dest[prefix+k] = v
return dest
print(flatmap(source))
运行结果:
{'d.e': 3, 'a.c': 2, 'd.f.g': 4, 'a.b': 1}
案例变形:(函数封装的思想)
source = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
def flatmap(src):
def _flatmap(src,dest=None,prefix=''):
for k,v in src.items():
if isinstance(v,(list,tuple,set,dict)):
_flatmap(v,dest,prefix=prefix+k+'.') #递归调用
else:
dest[prefix+k] = v
dest = {}
_flatmap(src,dest)
return dest
print(flatmap(source))
运行结果:
{'d.e': 3, 'a.c': 2, 'd.f.g': 4, 'a.b': 1}