Да , мы можем использовать рекурсию здесь:
def linearize(some_dict):
result = {}
def lin(subdic):
for k, v in subdic.items():
if isinstance(v, dict):
lin(v)
else:
result[k] = v
lin(some_dict)
return result
это приводит к:
>>> linearize(d)
{'k1': 'v1', 'nk1': 'v2', 'k3': 'v3'}
Обратите внимание, однако, что в случае поддиректории соответствующий ключ«игнорируется», это означает, что мы «теряем информацию», чтобы восстановить исходный словарь.
Если несколько поддиктариев содержат один и тот же ключ, будет использоваться значение последнего.Таким образом, вполне возможно, что результирующий словарь содержит меньше элементов значения ключа, чем (под) словари исходного словаря.
EDIT : вы также можете сделатьизвлечение следующим образом:
def extract(some_dict, to_extract):
result = {}
def ext(ky):
if isinstance(ky, str):
ky = (ky,)
subd = some_dict
for k in ky:
subd = subd[k]
result[k] = subd
for ky in to_extract:
ext(ky)
return result
тогда мы получим:
>>> extract(d, ["k1", ["k2", "nk1"], "k3"])
{'k1': 'v1', 'nk1': 'v2', 'k3': 'v3'}