所以,我有一本树形结构的字典。好吧,不完全是树。但是,我必须找到这棵树的最长路径。
这是字典:
{'1:0': [], '1:1': ['2:1', '1:0'], '1:2': ['1:3', '2:2', '1:1'], '1:3': [], '0:1': ['0:2', '1:1', '0:0'], '0:0': ['1:0'], '0:3': [], '0:2': ['0:3'], '2:3': ['2:2'], '2:2': ['3:2'], '2:1': ['2:2'], '2:0': ['2:1'], '3:2': [], '3:3': ['3:2'], '3:0': [], '3:1': ['3:2']}
实际上可能有很多根源。例如,在键1:1
中,它有两个子节点,其中一个是死端(1:0
)。然后2:1
有一个孩子2:2
。另外,1:1
是1:2
如何在python中编写此代码以遍历并找到最长的路径?
答案 0 :(得分:3)
您可以使用广度优先搜索的递归版本:
_d = {'1:0': [], '1:1': ['2:1', '1:0'], '1:2': ['1:3', '2:2', '1:1'], '1:3': [], '0:1': ['0:2', '1:1', '0:0'], '0:0': ['1:0'], '0:3': [], '0:2': ['0:3'], '2:3': ['2:2'], '2:2': ['3:2'], '2:1': ['2:2'], '2:0': ['2:1'], '3:2': [], '3:3': ['3:2'], '3:0': [], '3:1': ['3:2']}
def paths(d, _start, _current = []):
if _current:
yield _current
for i in d[_start]:
if i not in _current:
yield from paths(d, i, _current+[i])
results = [c for i in _d for c in paths(_d, i, [i])]
_max_len = max(map(len, results))
_paths = [i for i in results if len(i) == _max_len]
输出:
[['1:2', '1:1', '2:1', '2:2', '3:2'], ['0:1', '1:1', '2:1', '2:2', '3:2']]
答案 1 :(得分:1)
您应该考虑使用其他结构来保存此数据,这本质上是一个图形问题。 python带有一个非常有用的networkx库,用于图形。
您可以使用dag_longest_path在有向图中找到最长的路径。
semi_tree = {'1:0': [], '1:1': ['2:1', '1:0'], '1:2': ['1:3', '2:2', '1:1'], '1:3': [], '0:1': ['0:2', '1:1', '0:0'], '0:0': ['1:0'], '0:3': [], '0:2': ['0:3'], '2:3': ['2:2'], '2:2': ['3:2'], '2:1': ['2:2'], '2:0': ['2:1'], '3:2': [], '3:3': ['3:2'], '3:0': [], '3:1': ['3:2']}
import networkx as nx
my_graph = nx.DiGraph(semi_tree)
result = nx.dag_longest_path(my_graph)
print(result) #Output: ['1:2', '1:1', '2:1', '2:2', '3:2']