处理任何类型的层次(树)结构的简单、最小但功能强大的工具

treet的Python项目详细描述


Python的通用树实用程序

树是最普遍的数据结构之一。令人惊讶的是我们 因为程序员倾向于为不同的树重新实现相同的算法 格式和结构。在

此模块定义了通用的树遍历和树减少算法,这些算法可以 用于任何类似树的对象,如文件系统路径、列表、嵌套 字典一个表达式树甚至专门的树类!唯一的事 必须提供的是从父节点获取子节点的函数。在

此外,树通常在某些领域(如生物信息学)中被表示 newick格式,这对于解析非常重要,因此此模块包含一个 函数来执行此操作。在

用法和示例

PyPi安装:

pip install treet

导入基本函数traversereduceparse_newick

^{pr2}$

与任何类型的结构化树一起使用!

支持任何类型的结构化数据,在本例中,嵌套字典:

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# ...

AuthorAd115- Githuba.garcia230395@gmail.com

根据麻省理工学院的许可证分发。请参阅LICENSE更多信息。在

贡献

运行测试:pytest treet/* --hypothesis-show-statistics --verbose

要运行静态类型检查:mypy treet/*.py

要运行覆盖率分析:coverage run --source=. -m pytest treet/* --hypothesis-show-statistics --verbose

  1. 检查是否有未解决的问题,或者打开一个新的问题,围绕某个特性想法或bug展开讨论。在
  2. 在GitHub上分叉the repository,开始对功能分支进行更改,该分支派生自master分支。在
  3. 编写一个测试,测试该错误是否已修复,或者该功能是否按预期工作。在
  4. 发送一个pull请求并对维护者进行bug,直到它被合并和发布。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用无循环和乘法的递归调用查找值   java字符串大小冲突   在一组Java文件对象中查找唯一的超级目录   没有Eclipse控制台输出窗口(Java)?   java这怎么等于105而不是15?   java Adempiere列调出,用于不处理从(代码)选项导入和创建行的字段   java tomcat、2个webapps、2个log4js,但这两个应用都记录到一个文件中   lambda理解Java谓词   HotspotFX上的Java EOF问题   java google应用程序引擎:如何向连接/断开通道“ping”添加信息?   java如何使用VTDXML获取一个元素的所有名称空间声明?   java如何使用drawLine()获得一条线以随机方向拍摄?   java transactionManager应该使用哪个SessionFactory?   java在安卓上播放声音   在Mac上使用JBDC对SQL Server进行java Windows身份验证   java基本列表和字符串[]   java NamedParameterJdbcTemplate从中选择*   扩展上的java Android可扩展列表视图   使用ApacheAxis2的java SOAP附件