PythonTreelib多叉树数据结构中⽂使⽤帮助⽂档
Python Treelib 多叉树数据结构中⽂使⽤帮助⽂档
树,对于计算机编程语⾔来说是⼀个重要的数据结构。它具有⼴泛的应⽤,⽐如⽂件系统的分层数据结构和机器学习中的⼀些算法。这⾥创建了treelib来提供Python中树数据结构的⾼效实现。
1.安装
主要通过pip和easy_install进⾏安装
windows下:
pip install treelib
Linux下:
sudo easy_install -U treelib
License许可:
Redistributed under Apache License (2.0) since version 1.3.0.
Source:
2.类定义
主要分为Tree和Node两个类,以⽀持多叉树的实现
2.1.Tree类
魔法⽅法:
构造函数:新建⼀棵树或通过深拷贝、浅拷贝⽅式复制⼀棵树
Tree(self, tree=None, deep=False)
len取长度:返回树的节点个数,同Tree.size()
len(Tree)
str字符串:Tree对象转换为str对象,可输出
str(Tree)
unicode字符串:Tree对象转换为unicode对象,可输出
unicode(Tree)
⽅法:
add_node(self, node, parent=None)
向树添加⼀个node节点,该节点为Node类对象,其⽗节点为parent
all_nodes(self)
以list返回所有节点
children(self, nid)
返回以nid为标识(identifier)⼦节点,nid不存在则返回list为空
contains(self, nid)
检查树中是否包含以nid为标识的节点
create_node(self, tag=None, identifier=None, parent=None, data=None)
以parent为⽗节点,在树上创建⼀个节点(类似于创建Node对象,在add_node添加Node)
depth(self, node=None)
返回树的深度(int),若给定node则返回以该节点为根的树的深度
expand_tree(self, nid=None, mode=1, filter=None, key=None, reverse=False)
Python⽣成器,松散地基于 John R. Anderson, Albert T. Corbett, and Brian J. Reiser的⼀个算法 (’Essential LISP’ , page 239-241)
UPDATE: the @filter function is performed on Node object during traversing.
UPDATE: the @key and @reverse are present to sort nodes at each level.
get_node(self, nid)
返回以nid为标识的节点,nid不存在则返回为空
is_branch(self, nid)
返回以nid为节点的⼦节点标识(identifier)的list列表,nid不存在则返回list为空
leaves(self, root=None)
返回所有叶节点对象list列表,若给定root则返回以root为根节点的树的所有叶节点对象list列表
level(self, nid, filter=None)
返回指定深度的所有节点,根节点按深度0计算
Update: @filter params is added to calculate level passing exclusive nodes.
link_past_node(self, nid)
将某节点的⽗节点与⼦节点链接的⽅法,将该节点从树上删除
⽐如, ⼀个a -> b -> c树 ,删除b节点, 则剩下a -> c树
move_node(self, source, destination)
将source的节点移动⾄destination的⼦节点
parent(self, nid)
返回以nid为标识的节点的⽗节点
paste(self, nid, new_tree, deepcopy=False)
粘贴树,通过连接new_tree的根节点与nid标识的节点,设置deepcopy可进⾏深拷贝
Update: add @deepcopy of pasted tree.
paths_to_leaves(self)
取得根节点到每⼀个叶节点的标识路径,返回值为标识list列表的list列表(⼆重列表),根节点不省略
⽐如⼀棵树:
Harry
|___ Bill
|___ Jane
| |___ Diane
| |___ George
| |___ Jill
| |___ Mary
| |___ Mark
输出结果:
[['harry', 'jane', 'diane', 'mary'],
['harry', 'jane', 'mark'],python官方文档中文版
['harry', 'jane', 'diane', 'george', 'jill'],
['harry', 'bill']]
remove_node(self, identifier)
移除以nid标识的节点,同时移除其所有的⼦节点
返回值为移除的节点个数
remove_subtree(self, nid)
移除以nid标识为根节点的⼀棵⼦树
返回值为移除该⼦树的树,nid不存在则返回⼀个空树
该⽅法类似于remove_node(self,nid) 实现效果相同但返回值不同:
remove_node 返回移除的节点个数
remove_subtree 返回移除该⼦树的树
建议使⽤remove_node来删除节点,因为remove_subtree将消耗内存以存储新树(返回值)
rsearch(self, nid, filter=None)
遍历从以nid为标识的节点到根节点的路径(枝)
save2file(self, filename, nid=None, level=0, idhidden=True, filter=None, key=None, reverse=False, line_type=u'ascii-ex', data_property=None)将树保存到⽂件,以作离线分析
show(self, nid=None, level=0, idhidden=True, filter=None, key=None, reverse=False, line_type=u'ascii-ex', data_property=None)
输出树结构
siblings(self, nid)
返回以nid为标识的节点的兄弟节点
返回值为兄弟节点list列表,根节点⽆兄弟节点,返回空列表
size(self, level=None)
返回指定深度(level)节点个数,若⽆指定则返回整棵树节点个数
subtree(self, nid)
浅拷贝⽅式建⽴⼀个以nid为标识的节点作为根节点的⼦树,nid不存在则返回⼀个空树
若使⽤深拷贝,则请使⽤构造函数建⽴新树,如下:
< new_tree = Tree(t.), deep=True)
to_dict(self, nid=None, key=None, sort=True, reverse=False, with_data=False)
将树转换为dict字典
to_json(self, with_data=False, sort=True, reverse=False)
将树转换为JSON格式输出
2.2.Node类
魔法⽅法:
构造函数:新建⼀个Node节点对象
变量名称说明
tag标签树输出时显⽰,默认为随机值identifier标识树中唯⼀,不可重复,默认为随机值data数据存储节点中数据Node(self, tag=None, identifier=None, expanded=True, data=None)
⽅法:
is_leaf(self)
检查该节点是否是叶节点,返回布尔值
is_root(self)
检查该节点是否是根节点,返回布尔值
update_bpointer(self, nid)
设置_bpointer指针
update_fpointer(self, nid, mode=0)
设置_fpointer指针
3.实际应⽤
来源于官⽅帮助⽂档:
3.1.基本⽤法
下⾯的实例,展⽰了建⽴⼀棵树的基本⽅法
>>> from treelib import Node, Tree
>>> tree = Tree()
>>> ate_node("Harry", "harry") # root node
>>> ate_node("Jane", "jane", parent="harry")
>>> ate_node("Bill", "bill", parent="harry")
>>> ate_node("Diane", "diane", parent="jane")
>>> ate_node("Mary", "mary", parent="diane")
>>> ate_node("Mark", "mark", parent="jane")
>>> tree.show()
Harry
├── Bill
└── Jane
├── Diane
│└── Mary
└── Mark
3.2.API 样例
下⾯根据上述的数作为例⼦,展⽰⼀部分API⽤法样例 * 例1:利⽤特殊⽅法扩展⼀棵树
>>> print(','.join([tree[node].tag for node in \
Harry,Bill,Jane,Diane,Mary,Mark
例2:利⽤⾃定义过滤扩展⼀棵树
>>> print(','.join([tree[node].tag for node in \
x.identifier != 'diane')]))
Harry,Bill,Jane,Mark
例3:获得以“‘diane”为根节点的⼦树
>>> sub_t = tree.subtree('diane')
>>> sub_t.show()
Diane
└── Mary
例4:复制以“‘diane”为根节点的⼦树
>>> new_tree = Tree()
>>> ate_node("n1", 1) # root node
>>> ate_node("n2", 2, parent=1)
>>> ate_node("n3", 3, parent=1)
>>> tree.paste('bill', new_tree)
>>> tree.show()
Harry
├── Bill
│└── n1
│├── n2
│└── n3
└── Jane
├── Diane
│└── Mary
└── Mark
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论