Два решения
Первое - рекурсия
Второе - Глубина Первый поиск
Первое решение - Использование рекурсии
def find_path(d, value, path = [], sol = []):
for k, v in d.items():
if isinstance(v, dict):
path.append(k)
find_path(v, value, path, sol)
path.pop()
elif v == value:
path.append(k)
sol.append(path[:])
path.pop()
return sol
dic = {1 : {2 :
{3 : 4}
},
5 : {6 :
{7 : 8}}}
for v in range(10):
found = find_path(dic, v, [], [])
if found:
print("{} -> {}".format(v, found[0)) # showing first solution
# found will show them all
else:
print("No path to {}".format(v))
Вывод
No path to 0
No path to 1
No path to 2
No path to 3
4 -> [1, 2, 3]
No path to 5
No path to 6
No path to 7
8 -> [5, 6, 7]
No path to 9
Второе решение - Использование поиска по глубине
from collections import deque
def find_using_dfs(d, value):
" Finds using depth first searh through dictionary "
# Use queue for Depth First Search (LIFO)
stack = deque()
for k, v in d.items():
stack.append((v, [k]))
while stack:
v, path = stack.pop()
if isinstance(v, dict):
for k, viter in v.items():
path.append(k)
stack.append((viter, path[:]))
path.pop()
elif v == value:
return path
return None
dic = {1 : {2 :
{3 : 4}
},
5 : {6 :
{7 : 8}}}
for v in range(0, 10):
found = find_path_proc(dic, v)
if found:
print("{} -> {}".format(v, found))
else:
print("No path to {}".format(v))
Выход
No path to 0
No path to 1
No path to 2
No path to 3
4 -> [1, 2, 3]
No path to 5
No path to 6
No path to 7
8 -> [5, 6, 7]
No path to 9