Python 2.7 将输入列表映射到嵌套列表的最低级别

Python 2.7 将输入列表映射到嵌套列表的最低级别,python-2.7,nested,Python 2.7,Nested,我在Python中有一个类,它在自身内部存储了更多类似的内容,它是一个参差不齐的树结构。最高层和中间层不存储任何数据,但最低层存储任何数据。我有一个列表,比如[8,2,5,3],我想将每个值分配到树的最底层对应的插槽:每个节点向下可以有不同数量的连接,并且可以有任意数量的层。我的问题是,我无法使用类似问题中提供的遍历函数,因为我分配了多个值,并且我无法轻松获得底部每个值的索引。以下是节点类: class Node(object): def __init__(self, b

我在Python中有一个类,它在自身内部存储了更多类似的内容,它是一个参差不齐的树结构。最高层和中间层不存储任何数据,但最低层存储任何数据。我有一个列表,比如
[8,2,5,3]
,我想将每个值分配到树的最底层对应的插槽:每个节点向下可以有不同数量的连接,并且可以有任意数量的层。我的问题是,我无法使用类似问题中提供的
遍历
函数,因为我分配了多个值,并且我无法轻松获得底部每个值的索引。以下是节点类:

    class Node(object):
        def __init__(self, branches):
            self.branches = branches # This is a list of Node objects
            self.value = 0
分支列表包含更多节点,这些节点本身具有节点列表。该值默认为0,但如前所述,稍后将有一个映射到它们的列表。下面是一个如何创建树的示例,以及我要执行的操作:

tree = Node([
        Node([
            Node([
                None # This node's value is 1
            ]),
            Node([
                None # This node's value is 2
            ])
        ]),

        Node([
            Node([
                None # This node's value is 3
            ]),
            Node([
                None # This node's value is 4
            ])
        ])
    ])

    tree.set_inputs([1, 2, 3, 4]) # See above comments, this is what I want
我怎样才能做到这一点?我唯一的想法是一个递归函数,它将输入的索引转换为二进制(这可能会根据分支的数量而改变)数字,例如
0100110
,它通过索引其分支来确定每次递归的方向:

# In the example above: b0 -> b1 -> b0 -> b0 -> b1 -> b1 -> b0.

如果这是解决这个问题的方法,我需要一些帮助来实现它。否则,如果您对我的问题有任何帮助,我们将不胜感激。

深度优先搜索可以按照从左到右或从右到左的顺序生成树的叶节点,这取决于它的实现方式。首先,我将向您的
节点添加
名称
属性和
报告
,以便更容易地查看发生了什么:

class Node(object):
    def __init__(self, name, branches):
        self.branches = branches # This is a list of Node objects
        self.value = 0
        self.name = name

    def __repr__(self):
        return '<Node {}>'.format(self.name)
请注意有关此代码的一些内容。首先,我们迭代节点的
子节点。这导致叶片从左到右生长。如果我们删除
反向
,叶子将从右向左迭代。另外,请注意,对于没有任何子节点的叶节点来说,一种更简洁的表示方法是将一个空的iterable(例如空元组)分配给
node.branchs
。然后可以完全删除
节点.branchs不是None
检查

当然,上面的代码生成所有节点。我们只想要树叶:

def leaves(root):
    for node in dfs(root):
        if node.branches is None:
            yield node
>>> list(leaves(g))
[<Node a>, <Node b>, <Node c>, <Node d>]
让我们测试一下。下面是一个简单的树:

#      g
#     / \   
#    /   \
#   e     f
#  /\    /\
# a  b  c  d

a, b, c, d = [Node(name, None) for name in 'abcd']
e = Node('e', (a,b))
f = Node('f', (c,d))
g = Node('g', (e,f))
让我们列出树叶:

def leaves(root):
    for node in dfs(root):
        if node.branches is None:
            yield node
>>> list(leaves(g))
[<Node a>, <Node b>, <Node c>, <Node d>]
以便:

for node in (a, b, c, d):
    print(node.name, node.value)
给出:

a 1
b 2
c 3
d 4

在我们提供帮助之前,有很多问题需要回答。你的代码看起来像什么?节点的子节点是否有序?将值分配给叶节点的顺序重要吗,还是只分配每个值才重要?谢谢您的建议,对不起,我忘记了一个代码示例。我已将问题编辑为包含一个问题。此外,顺序也很重要。从左到右或从右到左是不相关的,只是它保持一致。