Python одноуровневый словарь из многоуровневого
Нужно сделать из многоуровневого словаря вида
d = {
"a": 5,
"b": 6,
"c": {
"f": 9,
"g": {
"m": 17,
"n": 3
}
}
}
словарь вида
{
'a': 5,
'b': 6,
'c.f': 9,
'c.g.m': 17,
'c.g.n': 3
}
Как я могу это сделать?
Ответы (2 шт):
Автор решения: Vadim.Sharoikin
→ Ссылка
не кидайтесь сильно камнями. Но можно примерно так)
d = {
"a": 5,
"b": 6,
"c": {
"f": 9,
"g": {
"m": 17,
"n": 3
}
}
}
new_d ={}
for k,v in d.items():
if type(v)!=dict:
new_d[k] = v
else:
for k1,v1 in v.items():
if type(v1)!=dict:
new_k = k+'.'+k1
new_d[new_k] = v1
else:
for k2,v2 in v1.items():
if type(v2)!=dict:
new_k1 = k+'.'+k1+'.'+k2
new_d[new_k1] = v2
print(new_d)
Автор решения: mkkik
→ Ссылка
Вариант с рекурсией:
d = {"a": 5, "b": 6, "c": {"f": 9, "g": {"m": 17, "n": 3}}}
def f(d, prefix='', sep='.'):
nd = {}
for k, v in d.items():
if isinstance(v, dict):
nd.update(f(v, f'{prefix}{k}{sep}'))
else:
nd[f'{prefix}{k}'] = v
return nd
print(f(d)) # -> {'a': 5, 'b': 6, 'c.f': 9, 'c.g.m': 17, 'c.g.n': 3}