处理任何类型的层次(树)结构的简单、最小但功能强大的工具
treet的Python项目详细描述
Python的通用树实用程序
树是最普遍的数据结构之一。令人惊讶的是我们 因为程序员倾向于为不同的树重新实现相同的算法 格式和结构。在
此模块定义了通用的树遍历和树减少算法,这些算法可以 用于任何类似树的对象,如文件系统路径、列表、嵌套 字典一个表达式树甚至专门的树类!唯一的事 必须提供的是从父节点获取子节点的函数。在
此外,树通常在某些领域(如生物信息学)中被表示 newick格式,这对于解析非常重要,因此此模块包含一个 函数来执行此操作。在
用法和示例
从PyPi安装:
pip install treet
导入基本函数traverse
、reduce
和parse_newick
:
与任何类型的结构化树一起使用!
支持任何类型的结构化数据,在本例中,嵌套字典:
tree={'label':'A','children':[{'label':'B','children':[]},{'label':'C','children':[{'label':'D','children':[]},{'label':'E','children':[]}]}]}defchildren(node):returnnode['children'][node['label']fornodeintreet.traverse(tree,children,mode='inorder')]# Output --> ['B, 'A', 'D', 'C', 'E']defas_list(node,children):ifnotchildren:returnnode['label']else:returnchildrentreet.reduce(tree,children,reduce_fn=as_list)# Output --> ['B, ['D', 'E']]
即使是用户定义的类!
将专用类格式的树转储为newick格式的字符串。在
classTree:def__init__(self,label,children=None):self.label=labelself.children=childrenifchildrenelse[]defis_leaf(self):returnlen(self.children)==0tree=Tree('A',[Tree('B'),Tree('C',[Tree('D'),Tree('E')])])defget_children(node):returnnode.childrendefnode_to_newick(node,children):ifnode.is_leaf():returnnode.labelelse:returnf"({','.join(children)})"treet.reduce(tree,get_children,node_to_newick)# Output --> '(B,(D,E))'
解析newick格式的树结构
将Newick字符串组合为自定义数据格式:
defparse_node_data(data_string):''' Example: 'data1=xx,data2=yy' -> {'data1':'xx', 'data2': 'yy'} '''items=data_string.split(',')key_value_pairs=(item.split('=')foriteminitems)returndict(key_value_pairs)defparse_branch_length(length_str):returnfloat(length_str)iflength_strelse0.0deftree_builder(label,children,branch_length,node_data):return{'label':label,'length':branch_length,'data':node_data,'children':children}newick="(A:0.2[dat=23,other=45], B:12.4[dat=122,other=xyz])root[x=y];"treet.parse_newick(newick,aggregator=tree_builder,feature_parser=parse_node_data,distance_parser=parse_branch_length)# Output ->{'label':'root','length':0.0,'data':{'x':'y'},'children':[{'label':'A','length':0.2,'data':{'dat':'23','other':'45'},'children':[]},{'label':'B','length':12.4,'data':{'dat':'122','other':'xyz'},'children':[]},]}
合成以执行复杂算法
获取由叶子子集诱导的子树:
tree=(('A',('B',('C','D'))),'E')defis_leaf(node):returnisinstance(node,str)defget_children(node):returnnodeifnotis_leaf(node)else[]definduced_subtree(leafs):definduced_subtree_generator(node,children):ifchildren:returntuple(chforchinchildrenifnotchisNone)else:returnnodeifnodeinleafselseNonereturninduced_subtree_generatorleafs=['B','D','E']induced=treet.reduce(tree,get_children,induced_subtree(leafs))print(induced)# Output --> ((('B',('D',)),),'E')defmerge_unary_nodes(node,children):ifis_leaf(node):returnnodenew_children=[ch[0]if(len(ch)==1)elsechforchinchildren]returntuple(new_children)treet.reduce(induced,get_children,merge_unary_nodes)# Output --> (('B','D'),'E')
即使文件系统路径也要使用!
按宽度优先顺序遍历/usr
目录:
frompathlibimportPathdefenter_folder(path):path=Path(path)returnlist(path.iterdir())ifpath.is_dir()else[]foritemintreet.traverse('/usr',enter_folder,mode='breadth_first'):print(item)# Output --># /# /proc# /usr# ...# /usr/share# /usr/bin# /usr/sbin# ...# /usr/bin/jinfo# /usr/bin/m2400w# ...
元
Author:Ad115- Github–a.garcia230395@gmail.com
根据麻省理工学院的许可证分发。请参阅LICENSE更多信息。在
贡献
运行测试:pytest treet/* --hypothesis-show-statistics --verbose
要运行静态类型检查:mypy treet/*.py
要运行覆盖率分析:coverage run --source=. -m pytest treet/* --hypothesis-show-statistics --verbose
- 检查是否有未解决的问题,或者打开一个新的问题,围绕某个特性想法或bug展开讨论。在
- 在GitHub上分叉the repository,开始对功能分支进行更改,该分支派生自master分支。在
- 编写一个测试,测试该错误是否已修复,或者该功能是否按预期工作。在
- 发送一个pull请求并对维护者进行bug,直到它被合并和发布。在
- 项目
标签: