python树结构包treelib入门及其计算应用
树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。
Treelib的主要特点包括:
- 节点搜索的高效操作。
- 支持常见的树操作,如遍历、插入、删除、节点移动、浅/深复制、子树切割等。
- 支持用户定义的数据负载以加速您的模型构建。
- 漂亮的树显示和文本/json 转储,用于漂亮的显示和离线分析。
- 与 Python 2 和 3 兼容
Snyk.io是一家专注于帮助企业解决开源软件安全问题的公司,给出评价是83分。
1. treelib安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple treelib
github地址:https://github.com/caesar0301/treelib
2. 树结构应用需求
如图所示一个分层次计算因素得分,例如“流动客户”得分是由其子节点因素“货运客户”与“旅游客户”合计得到,计算公式为:货运客户的权重×货运客户的评价值+旅游客户的权重×旅游客户的评价值。
通用计算公式如下:
y = ∑ i = 0 n w i x i y=\sum_{i=0}^{n}{w_i x_i} y=∑i=0nwixi
其中, w i w_i wi为任意因素节点的权重, x i x_i xi为任意因素节点的评价得分值, y y y是这些节点的父节点。
遍历整个树,计算最后的得分,采用递归方案,程序框图如下:
3. 入门使用
3.1. 创建一棵树
treelib 树由Tree和Node两个类完成,其中Node是树中的节点,主要由如下内容:
- identifier:唯一标识
- tag:标签
- data:数据
其他自行看源代码,包括父、子节点关系等内容。
在实际应用中,本文对“data”扩展,使用元组来定义更多的数据(0,1),0是评价得分值,1是权重。
from treelib import Node, Tree
tree = Tree()
tree.create_node("Harry", "harry",data=(None,None)) # root node
tree.create_node("Jane", "jane", parent="harry",data=(None,0.6))
tree.create_node("Bill", "bill", parent="harry",data=(None,0.4))
tree.create_node("Diane", "diane", parent="jane",data=(None,0.3))
tree.create_node("Mary", "mary", parent="jane",data=(None,0.35))
tree.create_node("Mark", "mark", parent="jane",data=(None,0.25))
tree.create_node("Green", "green", parent="bill",data=(None,0.3))
tree.create_node("White", "white", parent="bill",data=(None,0.7))
3.2. 树的简单操作
获取所有的叶子节点。
leaves = tree.leaves()
leaves
[Node(tag=Diane, identifier=diane, data=(None, 0.3)),Node(tag=Mary, identifier=mary, data=(None, 0.35)),Node(tag=Mark, identifier=mark, data=(None, 0.25)),Node(tag=Green, identifier=green, data=(None, 0.3)),Node(tag=White, identifier=white, data=(None, 0.7))]
给叶子节点赋值,易便后续进行计算。
factors_data={'Green':20,'Mark':30,'Mary':100,'Diane':50,'White':40}
for node in leaves:node.data=(factors_data[node.tag],node.data[1])
leaves
[Node(tag=Diane, identifier=diane, data=(50, 0.3)),Node(tag=Mary, identifier=mary, data=(100, 0.35)),Node(tag=Mark, identifier=mark, data=(30, 0.25)),Node(tag=Green, identifier=green, data=(20, 0.3)),Node(tag=White, identifier=white, data=(40, 0.7))]
获取兄弟节点。
# Return the siblings of given @nid. 获取兄弟节点
tree.siblings('diane')
[Node(tag=Mary, identifier=mary, data=(100, 0.35)),Node(tag=Mark, identifier=mark, data=(30, 0.25))]
获取父节点。
#Get parent :class:`Node` object of given id.
tree.parent('diane')
Node(tag=Jane, identifier=jane, data=(None, 0.6))
4. 实际应用
按权重和评价的分值,计算整颗树的各个因素的得分值。
# 计算综合评价
# 输入任意个节点(因素),endnid是约定结束节点
def calscore(tree, firstnode, endnid): nid = firstnode.identifier# 处理根节点 if (tree.parent(nid) == None or firstnode.identifier == endnid ) and firstnode.data[0]!=None:#print('root end')return firstnodeelif tree.parent(nid) ==None:parentnode = firstnodeelse:parentnode = tree.parent(nid)if firstnode.data[0]==None:# 没有计算,直接取子节点childnodes = tree.children(nid)# 计算分值calscore(tree, childnodes[0], endnid)else:# 已经计算,找兄弟节点(必须有兄弟,否则,合并节点)siblings = tree.siblings(nid)for node in siblings: if node.data[0]==None:# 没有计算,直接取子节点childnodes = tree.children(node.identifier)# 计算分值calscore(tree, childnodes[0], endnid)# 兄弟节点都已经计算(有数据的情况),计算父节点得分siblings.append(firstnode)score = 0for node in siblings:score = score + node.data[0]*node.data[1]parentnode.data=(score,parentnode.data[1]) print(parentnode.tag ,parentnode.data)calscore(tree, parentnode, endnid)nid ='white' # 'harry'
#nid = 'jane'firstnode = tree.get_node(nid)calscore(tree, firstnode, 'harry')
# 遍历树
print(','.join([tree[node].tag + str(tree[node].data) for node in tree.expand_tree(mode=Tree.DEPTH)]))
Harry(48.1, None),Bill(34.0, 0.4),Green(20, 0.3),White(40, 0.7),Jane(57.5, 0.6),Diane(50, 0.3),Mark(30, 0.25),Mary(100, 0.35)
5. 锦上添花画棵树
绘图使用graphviz,Graphviz 输入是一个用 dot 语言编写的绘图脚本,通过对输入脚本的解析,分析出其中的点、边及子图,然后根据属性进行绘制。
关于graphviz的使用,参见:Python安装使用graphviz经验,Format: “png“ not recognized。
# Generate DOT code file
tree.to_graphviz("hello.dot")# Can run the following command directly from the terminal as well.
import subprocess
subprocess.call(["dot", "-Tpng", "hello.dot", "-o", "graph1.png"])
关于subprocess:
运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。
subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
此图dot描述为:
digraph tree {"harry" [label="Harry", shape=circle]"bill" [label="Bill", shape=circle]"jane" [label="Jane", shape=circle]"green" [label="Green", shape=circle]"white" [label="White", shape=circle]"diane" [label="Diane", shape=circle]"mark" [label="Mark", shape=circle]"mary" [label="Mary", shape=circle]"harry" -> "jane""harry" -> "bill""bill" -> "green""bill" -> "white""jane" -> "diane""jane" -> "mary""jane" -> "mark"
}
6. 其他树解决方案参考
使用内置的defaultdict 我们可以很容易的定义一个树形数据结构。例如参考博文【一行python实现树形结构的方法】。
def tree(): return defaultdict(tree)users = tree()
users['harold']['username'] = 'bell'
users['handler']['username'] = 'master'
我们可以使用print(json.dumps(users))以json的形式输出,于是我们看到:
{'harold': {'username': 'bell'}, 'handler': {'username': 'master'}}
参考:
https://treelib.readthedocs.io/en/latest/
XerCis. Python树结构库treelib. CSDN博客. 2022.04
mowangdk. 一行python实现树形结构的方法 . 脚本之家. 2019.08
肖永威. Python安装使用graphviz经验,Format: “png“ not recognized. CSDN博客. 2023.10
相关文章:

python树结构包treelib入门及其计算应用
树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括: 节点搜索的高效操作。支持常见的树操作,如遍历、插入、删除、节点移动、浅/深复制…...

Rust之自动化测试(三): 测试组合
开发环境 Windows 10Rust 1.73.0 VS Code 1.83.1 项目工程 这里继续沿用上次工程rust-demo 测试组合 正如本章开始时提到的,测试是一个复杂的学科,不同的人使用不同的术语和组织。Rust社区根据两个主要类别来考虑测试:单元测试和集成测试。单元测试很…...

专业管理菜单的增删改、查重
1,点击专业管理菜单------查询所有专业信息列表 ①点击菜单,切换专业组件 ②切换到列表组件后,向后端发送请求到Servlet ③调用DAO层,查询数据库(sql),封装查询到的内容 ④从后端向前端做出…...

vue3插件开发,上传npm
创建插件 在vue3工程下,创建组件vue页: toolset.vue。并设置组件名称。注册全局组件。新建index.js文件。内容如下,可在main.js中引入index.js,注册该组件进行测试。
python【多线程、单线程、异步编程】三个版本--在爬虫中的应用
并发编程在爬虫中的应用 之前的课程,我们已经为大家介绍了 Python 中的多线程、多进程和异步编程,通过这三种手段,我们可以实现并发或并行编程,这一方面可以加速代码的执行,另一方面也可以带来更好的用户体验。爬虫程…...

大模型LLM相关面试题整理-位置编码-tokenizer-激活函数-layernorm
10 LLMs 位置编码篇 10.1.1 什么是位置编码? 位置编码是一种用于在序列数据中为每个位置添加位置信息的技术。在自然语言处理中,位置编码通常用于处理文本序列。由于传统的神经网络无法直接捕捉输入序列中的位置信息,位置编码的引入可以帮助…...
python在nacos注册微服务
安装 首先需要安装python的nacos sdk pip install nacos-sdk-python 注册 注册过程非常简单,需要注意的是,注册完要定时发送心跳,否则服务会被nacos删掉。 import nacos import timeSERVER_ADDRESSES "http://1.2.3.4:8848" …...

tuxera ntfs2024破解版mac电脑磁盘读写软件
大家都知道由于操作系统的原因,在苹果电脑上不能够读写NTFS磁盘,但是,今天小编带来的这款tuxera ntfs 2024 mac版,完美的解决了这个问题。这是一款在macOS平台上使用的磁盘读写软件,能够实现苹果Mac OS X系统读写Micro…...

【源码】C++坦克大战源码
文章目录 题目介绍你收到的所有文件源码效果展示报告内容 题目介绍 代码量:1450 语言:C 你收到的所有文件 其中一个是devc版本,也可以用visual stdio 运行。 源码效果展示 typedef struct //这里的出现次序指的是一个AI_ta…...

AIO开放接口平台免费畅享ChatGPT聊天、联网互动、学术等服务!更有DALL·E 3最强AI绘图功能!
免费畅享! AIO平台ChatGPT联网、聊天、学术等服务! AIO开放接口平台 | 服务介绍 ALL IN ONE (AIO)API服务是LLM(大语言模型)开放接口平台:持续接入各种主流的大模型接口,并提供简单、易用、统一的API交互…...
【python】屈小原现在要为学校写校庆贺文(CTGU百年校庆)
题目: """ 题目描述: 屈小原需要为学校的校庆写一篇贺文,共需写下n个字,但他目前只完成了1个字。屈小原可以进行两种操作: 在文档的末尾添加一个字,这样字数就会变为x1。 写下与当前字数相同…...

探索未来的视觉革命:卷积神经网络的崭新时代(二)
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...

博客后台模块续更(三)
四、后台模块-动态路由 实现了这个动态路由功能之后,就能在浏览器web页面登录进博客管理后台了 1. 接口分析 后台系统需要能实现不同的用户权限可以看到不同的功能,即左侧的导航栏 请求方式 请求地址 请求头 GET /getRouters 需要token请求头 …...
第十二届蓝桥杯模拟赛第三期
A填空题 问题描述 请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。 参考答案 800 public class Main {public static void main(String[] args) {int ans0;for(int i1;i<2020;i) {if(gcd(2020,i)1) {ans;}}…...

2023年浙大MEM考前80天上岸经验分享
时间过得真快,转眼间已经是十月份了。回想起去年这个时候,我还在为考研而感到焦虑不安。然而,如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中,我不仅学到了许多专业知识,还结识了很多志同道合…...

增加并行度后,发现Flink窗口不会计算的问题。
文章目录 前言一、现象二、结论三、解决 前言 窗口没有关闭计算的问题,一直困扰了很久,经过多次验证,确定了问题的根源。 一、现象 Flink使用了window,同时使用了watermark ,并且还设置了较高的并行度。生产是设置了…...
使用 JMeter 和 Docker 进行服务存根
用于性能测试的服务存根:简介 随着测试项目的复杂性不断增加,越来越多的被测系统的测试流程受到依赖系统的影响。当我说“依赖系统”时,我指的是: 不受当前开发影响的遗留系统 属于另一个组织的第三方服务 您的组织开发的系统&am…...

《王道计算机考研——操作系统》学习笔记总目录+思维导图
本篇文章是对《王道计算机考研——操作系统》所有知识点的笔记总结归档和计算机网络的思维导图 学习视频:王道计算机考研 操作系统 408四件套【计网、计组、操作系统、数据结构】完整课堂PPT 思维导图 (求Star~):【王道考研】计…...

多模态及图像安全的探索与思考
前言 第六届中国模式识别与计算机视觉大会(The 6th Chinese Conference on Pattern Recognition and Computer Vision, PRCV 2023)已于近期在厦门成功举办。通过参加本次会议,使我有机会接触到许多来自国内外的模式识别和计算机视觉领域的研究…...

基础算法相关笔记
排序 最好情况下: 冒泡排序 最坏时间复杂度 O ( n 2 ) O(n^2) O(n2)。 插入排序 最坏时间复杂度为 O ( n 2 ) O(n^2) O(n2),最优时间复杂度为 O ( n ) O(n) O(n)。 平均情况下: 快速排序 最坏时间复杂度为 O ( n 2 ) O(n^2) O(n2)&…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...