如何在Python中生成树?

时间:2017-10-29 15:37:54

标签: python loops tree itertools

我有一个__max_depth和一个__max_splits参数,我想生成一个随机树,以便每个"节点"我可以执行某项操作(例如生成随机数)。

然而,我几乎陷入困境,因为我无法理解嵌套循环中哪一个首先出现:for depth in range(0, __max_depth)还是for split in range(0, __max_splits)

我想到的基本上是一条可以像这样完全遍历树的路径(在这种情况下,深度为3,分割为2):

- root -> node 1a -> node 2aa -> node 3aaa
                              -> node 3aab
                  -> node 2ab -> node 3aba
                              -> node 3abb
       -> node 1b -> node 2ba -> node 3bba
                              -> node 3bab
                  -> node 2bb -> node 3bba
                              -> node 3bbb

我也希望能够理解我在树中的位置,更具体地说,我在树中的深度(因为depth % 2 == 0我喜欢做某些操作,因为a depth % 2 == 1其他人。)

有关如何在纯Python中实现它的任何建议?我很失落。

编辑:我尝试做的是生成随机游走。我想从自定义点(我的根)开始遍历几乎无限的有向网络(图形),并保存我给出路径时分析的节点的所有信息。 随机游走所覆盖区域的大小由两个参数决定(区域的高度为max_depth,宽度为max_split)。

2 个答案:

答案 0 :(得分:1)

你可以从递归结构开始吗? 这是一个极简主义示例,其中有一个类来表示一个节点,可以让您跟踪,但您也可以使用字典或命名元组的集合来组织数据:

SELECT

您可以将子项添加到根目录,并将树增长到所需的深度。

我会让你思考,搜索,弄清楚如何穿越你的树,跟踪深度等......

答案 1 :(得分:1)

对我来说,你想要达到的目标并不完全清楚,但听起来你正在做一些家庭作业或锻炼。所以我不会给你程序代码。但是一个如何自己实现它的概念。

一种 - 简单方法是使用递归。定义生成节点的函数。这个节点只不过是一个项目列表 - 叶子或嵌套节点。

如果调用此函数,则向该函数传递两个参数:首先是树的预期深度,第二个是节点应该具有的叶子,分支或“分裂”的数量。

该函数应包含创建列表的代码。如果 - 且仅当 - 树的深度为零,则返回一个充满随机数的列表。您可以使用def walk(treeNode, maxDepth, maxSpread, currentPath = "", cache = None): if cache is None: cache = {} for i in range(maxSpread): leaf = treeNode.getLeaf(i) # do something with leaf, generate /value/ cache[currentPath] = value if maxDepth >= 1: walk(leaf, maxDepth - 1, maxSpread, path + "|" + str(i), cache) 模块来实现这一目标。但是,如果所需深度大于零,请填写此列表,而不是使用数字,而是填充节点!要让节点从该函数内再次调用您的函数,因为此函数正在生成节点。 (这称为“递归”。)但是调用深度减1的函数:这​​样每个函数调用都会导致更多的函数调用(深度减小)。这样,当您下到树中时,您将根据需要自动生成节点。

在开始实施之前,您可能希望首先更详细地了解递归。请先详细了解一下,我觉得网上有很多关于这方面的资料。

并且 - 对于记录 - 我认为最终你需要大约十行代码。

编辑:我仍然不完全理解你想要做什么,但认为这是一个起点:

cache

此处{{1}}存储了您想要跟踪的一些值。该方法继续通过树状网络。如果你想随机化它,你需要以随机的方式选择节点,而不是像我的例子那样一个接一个。