Python 2.7 中 AND-OR-tree 的存储格式

Posted

技术标签:

【中文标题】Python 2.7 中 AND-OR-tree 的存储格式【英文标题】:Storage Format for AND-OR-tree in Python 2.7 【发布时间】:2016-12-26 10:42:36 【问题描述】:

我目前正在使用决策树做一些工作,我使用 AND-OR 树作为表示。我正在为这类树寻找合适的存储格式。

以“t”开头的节点是OR节点,以“c”开头的节点是(有序!)AND节点。叶子总是以“p”开头。

最初,每个节点都包含两部分:节点名称和节点描述。

图片展示了同一棵决策树的两种不同表示。基本上我需要两种表示,分别是一个简单快速的解决方案来将表示相互转换。

到目前为止我的想法

数据类型:

字典:必须使用有序字典。此外,存储名称和描述会更容易。

列表会很好,因为定义了顺序,但是我不知道如何以一种好的方式保存节点名称和描述。

节点链接:

基本上,这两种数据类型都可以使用。但是我不知道如何将节点相互链接。我应该使用关键字(例如“AND”和“OR”)还是应该嵌套节点?

非常感谢您的任何意见。

【问题讨论】:

“字典:字典中的顺序未定义”:标准库中有一个 OrderedDict docs.python.org/3.5/library/… 对不起,我完全忘记了。你说的对。我将此添加到我的问题中。即使有可能使用有序的字典,问题是,使用字典是否有意义。我补充说,我正在寻找 python 2.7 中的解决方案 您还可以使用字段名称、类型、描述、后代节点列表以及对父节点的必要引用来创建自定义类。但是,如果它很重要,我相信它的计算效率不会很高。 【参考方案1】:

如果您使用列表,则可以通过嵌套将它们链接在一起。 比如:

['t1', ['c1', 'p1', ['c2', 'p2', 'p3']], ['c3', ['c4', 'p4', 'p5'], ['t2', ['c5', 'p6', 'p7'], 'p8']]]

基本结构是:

BASE := [node_name, left, right]

地点:

node_name 是(在本例中)一个字符串,并且 leftright 是 要么是BASE(这意味着它们要么是c要么是t 节点类型)或node name(这隐含意味着它们是叶子 节点)

没有什么能阻止你使用OrderedDicts,但创建过程变得有点麻烦 IMO:

In [26]: from collections import OrderedDict as OD

In [27]: tree = OD((('name', 't1'), ('left', 'c1'), ('right', OD((('name', '...'),)) )))

In [28]: tree
Out[28]: 
OrderedDict([('name', 't1'),
             ('left', 'c1'),
             ('right', OrderedDict([('name', '...')]))])

最后,您可以创建自己的数据结构:

class Node:
     type = ''
     left = None
     right = None

【讨论】:

以上是关于Python 2.7 中 AND-OR-tree 的存储格式的主要内容,如果未能解决你的问题,请参考以下文章

在 chrome 中自动打印/保存网页为 pdf - python 2.7

linux中python2.6升级2.7

ubuntu中python 2.7的串口初始化

无法在 mac os 中卸载 python 2.7

为什么在Python 2.7中自动打印括号?

在 Python 3.5 中读取在 Python 2.7 中生成的文件