Вы можете использовать рекурсию с генератором для формирования путей, а затем string.ascii_lowercase
для числового сохранения результатов:
data = {'from': ['b','c','d','e','f','g'], 'to': ['a', 'a', 'a', 'b','c','e']}
d = list(zip(data['from'], data['to']))
def get_paths(n, c = []):
if n is None:
yield from [i for k, _ in d for i in get_paths(k)]
elif (r:=[b for a, b in d if a == n]):
yield from [i for k in r for i in get_paths(k, c+[n])]
else:
yield c+[n]
result = list(get_paths(None))
#[['b', 'a'], ['c', 'a'], ['d', 'a'], ['e', 'b', 'a'], ['f', 'c', 'a'], ['g', 'e', 'b', 'a']]
Затем, чтобы преобразовать в целые числа:
from string import ascii_lowercase as al
new_results = [[al.index(b)+1 for b in i] for i in result]
Вывод:
[[2, 1], [3, 1], [4, 1], [5, 2, 1], [6, 3, 1], [7, 5, 2, 1]]