Вы можете отслеживать просмотренные ключи:
def build_new(_d, seen = []):
[[a, b]] = _d.items()
return {b:seen+[a]} if not isinstance(b, dict) else build_new(b, seen+[a])
print(build_new({1:{2:{3:{4:'foo'}}}}))
Вывод:
{'foo': [1, 2, 3, 4]}
Однако вышеприведенное решение будет работать только тогда, когда в каждом словаре есть только один ключ,Чтобы найти все пути в общем, используйте yield
:
def all_paths(d, seen = []):
for a, b in d.items():
if not isinstance(b, dict):
yield {b:seen+[a]}
else:
yield from all_paths(b, seen+[a])
d = {1:{2:{3:'bar', 4:'foo', 5:{6:'stuff'}}}}
print(list(all_paths(d)))
Вывод:
[{'bar': [1, 2, 3]}, {'foo': [1, 2, 4]}, {'stuff': [1, 2, 5, 6]}]