Python构造树结构应用到城市层级编码

应用背景

在实际的场景应用中,经常需要对一些数据做一些层级编码,这时候需要使用树形结构来支持这一实现。这里给出一个典型的应用例子,对全国城市的层级编码,例如全国下面有34个省级行政区,以湖北省为例,湖北省下面有15个省辖市或者州,每个市下面又有若干个区域或者县。这样的非常常见的层级结构可以用一颗数来表示,这里使用Python来实现树的结构

数据样本

定义城市样本文件数据(这里只是部分)如下,每行一条记录,每条记录中不同级别用逗号分隔

上海市,市辖区,徐汇区
上海市,市辖区,杨浦区
上海市,市辖区,松江区
上海市,市辖区,长宁区
上海市,市辖区,闵行区
云南省,临沧市,临翔区
云南省,临沧市,云县
云南省,临沧市,凤庆县
云南省,临沧市,双江拉祜族佤族布朗族傣族自治县
云南省,临沧市,永德县
云南省,临沧市,沧源佤族自治县
云南省,临沧市,耿马傣族佤族自治县
云南省,临沧市,镇康县
云南省,丽江市,华坪县
云南省,丽江市,古城区
云南省,丽江市,宁蒗彝族自治县
云南省,丽江市,永胜县
云南省,丽江市,玉龙纳西族自治县
云南省,保山市,施甸县
云南省,保山市,昌宁县
云南省,保山市,腾冲县
云南省,保山市,隆阳区
云南省,保山市,龙陵县

树的结构

我们定义树的节点,包含以下几个元素

名称 类型 描述 描述
name String 名称,省名称、城市名称、区名称 “云南省”
index String 节点编号值的路径,从根节点到此节点的路径 “0|11|1101|110101”
value String 节点编号的值 “110101”
children array 节点的孩子节点 [“110101”,“110102”,“110103”]

编码规则

我们定义一个编码规则,首先,对待排序文件按照文本进行排序,这样每个省的数据都集中在一起而且都是排好序的,然后设置“全国”的value为“0”,然后一级目录(省)value从“10”开始,二级目录(市)的value从对应的一级目录 * 100 开始,三级四级依次类推。

树节点代码

class Node(object):def __init__(self, name, value="0", index="0"):self.name = nameself.index = indexself.value = valueself.children = []# 查询节点在树中的位置def search(self, node):if self.name == node.name:return selfif not self.children:return Noneelse:for child in self.children:childres = child.search(node)if childres:return childresreturn Nonedef add_child(self, node):self.children.append(node)def set_value(self, value):self.value = valuedef set_index(self, index):self.index = index# 将整棵树变成json格式def to_json(self):res = {}res['value'] = self.valueres['name'] = self.nameres['index'] = self.indexres['children'] = []for child in self.children:res['children'].append(child.to_json())return res# 通过节点全路径寻找节点名称def index_display(self, index):if self.index == index:print(self.name)if self.children:for child in self.children:child.index_display(index)

树的创建过程

def create_tree_from_local_file():first_no = 10  # 一集目录从10开始,二级目录为对应的一级目录*100开始,三级四季依次类推root_node = Node("全国", index="0")  # 根节点path = "your file path"  # 这里填写你的路径,文件内容如上面样本数据所示for line in open(path encoding="utf-8"):  lines = line.strip("\r\n").split(",")first_node = Node(lines[0])  # 一级目录需要指定编码if first_node.name not in [child.name for child in root_node.children]:first_node.set_value(str(first_no))first_node.set_index(root_node.index + "|" + first_node.value)first_no = first_no + 1root_node.add_child(first_node)cur_node = root_node.search(first_node)for node in [Node(name=tmp) for tmp in lines[1:]]:  # 二级以后直接根据一级目录的编号开始if node.name not in [child.name for child in cur_node.children]:length = len(cur_node.children)node.set_value(str(length + 100 * int(cur_node.value)))node.set_index(cur_node.index + "|" + node.value)cur_node.add_child(node)cur_node = root_node.search(node)print(root_node.to_json())

运行结果

{"value": "0", "name": "全国", "index": "0", "children": [{"value": "10", "name": "上海市", "index": "0|10", "children": [{"value": "1000", "name": "市辖区", "index": "0|10|1000", "children": [{"value": "100000", "name": "徐汇区", "index": "0|10|1000|100000", "children": [ ]}, {"value": "100001", "name": "杨浦区", "index": "0|10|1000|100001", "children": [ ]}, {"value": "100002", "name": "松江区", "index": "0|10|1000|100002", "children": [ ]}, {"value": "100003", "name": "长宁区", "index": "0|10|1000|100003", "children": [ ]}, {"value": "100004", "name": "闵行区", "index": "0|10|1000|100004", "children": [ ]}]}]}, {"value": "11", "name": "云南省", "index": "0|11", "children": [{"value": "1100", "name": "临沧市", "index": "0|11|1100", "children": [{"value": "110000", "name": "临翔区", "index": "0|11|1100|110000", "children": [ ]}, {"value": "110001", "name": "云县", "index": "0|11|1100|110001", "children": [ ]}, {"value": "110002", "name": "凤庆县", "index": "0|11|1100|110002", "children": [ ]}, {"value": "110003", "name": "双江拉祜族佤族布朗族傣族自治县", "index": "0|11|1100|110003", "children": [ ]}, {"value": "110004", "name": "永德县", "index": "0|11|1100|110004", "children": [ ]}, {"value": "110005", "name": "沧源佤族自治县", "index": "0|11|1100|110005", "children": [ ]}, {"value": "110006", "name": "耿马傣族佤族自治县", "index": "0|11|1100|110006", "children": [ ]}, {"value": "110007", "name": "镇康县", "index": "0|11|1100|110007", "children": [ ]}]}, {"value": "1101", "name": "丽江市", "index": "0|11|1101", "children": [{"value": "110100", "name": "华坪县", "index": "0|11|1101|110100", "children": [ ]}, {"value": "110101", "name": "古城区", "index": "0|11|1101|110101", "children": [ ]}, {"value": "110102", "name": "宁蒗彝族自治县", "index": "0|11|1101|110102", "children": [ ]}, {"value": "110103", "name": "永胜县", "index": "0|11|1101|110103", "children": [ ]}, {"value": "110104", "name": "玉龙纳西族自治县", "index": "0|11|1101|110104", "children": [ ]}]}, {"value": "1102", "name": "保山市", "index": "0|11|1102", "children": [{"value": "110200", "name": "施甸县", "index": "0|11|1102|110200", "children": [ ]}, {"value": "110201", "name": "昌宁县", "index": "0|11|1102|110201", "children": [ ]}, {"value": "110202", "name": "腾冲县", "index": "0|11|1102|110202", "children": [ ]}, {"value": "110203", "name": "隆阳区", "index": "0|11|1102|110203", "children": [ ]}, {"value": "110204", "name": "龙陵县", "index": "0|11|1102|110204", "children": [ ]}]}]}]
}

Python构造树结构应用到城市层级编码相关推荐

  1. 【Python】通过构造树结构解析查询条件

    [Python]通过构造树结构解析查询条件 背景概述 最近遇到了需要解析类似这种东西的需求 名称,摘要,主权项+=(育种 or 选育 or (培育 and (种 or 苗)) or 育苗) and ( ...

  2. Python之sklearn:LabelEncoder函数简介(编码与编码还原)、使用方法、具体案例之详细攻略

    Python之sklearn:LabelEncoder函数简介(编码与编码还原).使用方法.具体案例之详细攻略 目录 LabelEncoder函数的简介(编码与编码还原) Methods LabelE ...

  3. python刚出来多少薪资-Python工资待遇的几个层级,你工作几年了?目前是哪个层级?...

    原标题:Python工资待遇的几个层级,你工作几年了?目前是哪个层级? 出来这么多期的Python学习教程,也给大家讲了很多关于Python编程的学习技巧和方法,有没有伙伴还是晕头转向的状态,今天想跟 ...

  4. 5.1 Python图像处理之图像编码-哈夫曼编码

    5.1 Python图像处理之图像编码-哈夫曼编码 文章目录 5.1 Python图像处理之图像编码-哈夫曼编码 1 算法原理 2 代码 3 效果 1 算法原理 哈夫曼编码是一种根据词频变化的变长二进 ...

  5. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  6. python构造一个二叉树_如何用python构造一个n层的完全二叉树

    展开全部 用python构造一个5261n层的完全二叉树4102的代码如下: typedef struct { int weight; int parent, lchild, rchild; } HT ...

  7. python为什么中文要encoding-python2.x 默认编码问题

    python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自己总结一篇文章. 我也会在以后学习中,不断的修改此篇博客. 这里假设读者已有与编码相关的 ...

  8. python 测试字符串类型_【教程】如何用Python中的chardet去检测字符编码类型

    [背景] 之前已经使用过chardet了,也算用了不少次了. 之前也写过和chardet相关的: 但是没写教程,举例说明如何使用. 现在去举例解释解释. [python示例代码演示如何用chardet ...

  9. python链表和树实验报告_关于Python实现树结构和链表结构的一点想法

    关于Python实现树结构和链表结构的一点想法 Python由于内置的数据结构具有很高的灵活性,所以可以用很多种方式来构建树.图.链表等结构 1. 树的Python实现 python自然可以使用cla ...

  10. python中factor函数_左手用R右手Python系列——因子变量与分类重编码

    原标题:左手用R右手Python系列--因子变量与分类重编码 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业 ...

最新文章

  1. mysql 字段必填 属性_如何判断数据库中的字段是否具有必填属性(50分)
  2. 7、Java并发性和多线程-如何创建并运行线程
  3. getclass方法 给属性赋值_反射给没有set方法的属性赋值
  4. java 加载资源_在Java中加载资源的首选方式
  5. rmi 反序列化漏洞_写一个rmi反序列化工具
  6. 开发提效小技巧分享(一)
  7. tf.GraphKeys,tf.add_to_collection() 与 tf.get_collection()
  8. python 可视化 词云图
  9. 《从零开始的RPG游戏制作教程》前言
  10. html协议是一种用于什么的协议,FTP协议是一种用于( )的协议。
  11. 看雪CTF.TSRC 2018 团队赛 第二题 半加器 writeup
  12. 计算机应用团队,【计算机应用论文】团队合作学习下计算机应用论文(共3025字)...
  13. Android体系架构及认识
  14. 校验手机号正则,支持166及199等手机号
  15. Spring Cloud的Ribbon-Hystrix-Feign
  16. “拉驴不卸磨”(电动三轮车蓄电池)的必然命运
  17. div+css实现水平/垂直/水平垂直居中超详解
  18. php验证码zhuc_微信小程序实例:实现随机验证码(附代码)
  19. Linux 天文软件YAO保存图片(PSF wavefront等)
  20. 腾讯视频下载|腾讯视频播放器下载

热门文章

  1. CodeMirror使用说明书
  2. 17个支持图片外链的免费相册
  3. 俄亥俄州立大学计算机硕士申请,俄亥俄州立大学计算机科学与工程理学硕士研究生申请要求及申请材料要求清单...
  4. excel快速删除奇偶数行
  5. 长截图或长图片如何按页面切分后打印或插入到Word文档中
  6. Ubuntu18.04关闭内核自动更新
  7. 机器学习sklearn----支持向量机SVC模型评估指标
  8. Eclipse中去掉代码中的警告Warn
  9. POJ 3047 Bovine Birthday 日期定周求 泽勒公式
  10. linux 搜狗输入法快捷键设置,Linux配置中文输入法(搜狗输入法)-Go语言中文社区...