Python 2.7 将输入列表映射到嵌套列表的最低级别
我在Python中有一个类,它在自身内部存储了更多类似的内容,它是一个参差不齐的树结构。最高层和中间层不存储任何数据,但最低层存储任何数据。我有一个列表,比如Python 2.7 将输入列表映射到嵌套列表的最低级别,python-2.7,nested,Python 2.7,Nested,我在Python中有一个类,它在自身内部存储了更多类似的内容,它是一个参差不齐的树结构。最高层和中间层不存储任何数据,但最低层存储任何数据。我有一个列表,比如[8,2,5,3],我想将每个值分配到树的最底层对应的插槽:每个节点向下可以有不同数量的连接,并且可以有任意数量的层。我的问题是,我无法使用类似问题中提供的遍历函数,因为我分配了多个值,并且我无法轻松获得底部每个值的索引。以下是节点类: class Node(object): def __init__(self, b
[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
在我们提供帮助之前,有很多问题需要回答。你的代码看起来像什么?节点的子节点是否有序?将值分配给叶节点的顺序重要吗,还是只分配每个值才重要?谢谢您的建议,对不起,我忘记了一个代码示例。我已将问题编辑为包含一个问题。此外,顺序也很重要。从左到右或从右到左是不相关的,只是它保持一致。