Python 来自[分层]非二叉树的所有路径

Python 来自[分层]非二叉树的所有路径,python,python-3.x,Python,Python 3.x,我有一个描述树的字典列表,例如: tree = [{(1,0): [(1,0), (1,1), (1,2)], (1,3): [(1,3), (1,4), (1,5)]}, {(1,0): [(2,0)], (1,1): [(2,1)], (1,2): [(2,2)], (1,3): [(2,0)], (1,4): [(2,1)], (1,5): [(2,2)]},

我有一个描述树的字典列表,例如:

tree = [{(1,0): [(1,0), (1,1), (1,2)], 
         (1,3): [(1,3), (1,4), (1,5)]},
        {(1,0): [(2,0)],
         (1,1): [(2,1)],
         (1,2): [(2,2)],
         (1,3): [(2,0)],
         (1,4): [(2,1)],
         (1,5): [(2,2)]},
        {(2,0): [(1,0), (1,3)], 
         (2,1): [(1,1), (1,4)], 
         (2,2): [(1,2), (1,5)]}
       ]
每一行都是包含下一个分支的dict。第一行中dict的键是根,后续行包含下一个可能的节点

我想创建一个包含所有可能路径的列表,例如:

[[(1,0), (1,0), (2,0), (1,0)],
 [(1,0), (1,0), (2,0), (1,3)],
 [(1,0), (1,1), (2,1), (1,1)],
 [(1,0), (1,1), (2,1), (1,4)],
 ...
 ...
 [(1,3), (1,5), (2,2), (1,2)],
 [(1,3), (1,5), (2,2), (1,5)]]
虽然有很多关于对二叉树或非二叉树(但使用嵌套字典)使用递归/生成器的例子,但在如上所述的树的情况下,我找不到合适的方法来实现这一点。此外,使用和所有简单路径并不能保持树的分层特性,因此对于此应用程序来说是不正确的


想法?

以下递归生成器函数可以:

def paths(tree, node=None):
    if not tree or (node and node not in tree[0]):
        yield [node] if node else []
        return
    d = tree[0]
    nodes = [node] if node else d.keys()
    for node in nodes:
        for child in d[node]:
            for path in paths(tree[1:], node=child):
                yield [node] + path

>>> list(paths(tree))
[[(1, 0), (1, 0), (2, 0), (1, 0)],
 [(1, 0), (1, 0), (2, 0), (1, 3)],
 [(1, 0), (1, 1), (2, 1), (1, 1)],
 [(1, 0), (1, 1), (2, 1), (1, 4)],
 [(1, 0), (1, 2), (2, 2), (1, 2)],
 [(1, 0), (1, 2), (2, 2), (1, 5)],
 [(1, 3), (1, 3), (2, 0), (1, 0)],
 [(1, 3), (1, 3), (2, 0), (1, 3)],
 [(1, 3), (1, 4), (2, 1), (1, 1)],
 [(1, 3), (1, 4), (2, 1), (1, 4)],
 [(1, 3), (1, 5), (2, 2), (1, 2)],
 [(1, 3), (1, 5), (2, 2), (1, 5)]]