一行python代码实现树结构
树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用。一颗树可以简单的表示为根, 左子树, 右子树。 而左子树和右子树又可以有自己的子树。这似乎是一种比较复杂的数据结构,那么真的能像我们在标题中所说的那样,用一行Python代码就可以实现吗?
一行代码实现?
由于树形结构的外层和内层有着相似的结构,所以多可以用递归的方式定义树。再利用Python中提供的defaultdict,我们就可以很轻松地定义树了,而且只有一行代码。
from collections import defaultdict def tree(): return defaultdict(tree)
这个代码分享自https://gist.github.com/hrldcpr/2012250。根据上面的代码,一棵树就是一个默认值也为树的字典。
具体效果演示
这样实现的树有两个奇妙之处,第一点是我们不需要创建节点,就可以直接引用它们。例如:
users = tree()
users['codingpy']['username'] = 'earlgrey'
users['python']['username'] = 'Guido van Rossum'
如果仅从常规字典的特性来看,上面的赋值操作是不成立的,因为我们必须事先声明users['codingpy'] = {}。但是我们利用的是collections模块中的defaultdict类,如果某个键不存在时,它就会利用tree()来为该键创建一个初始值,因为tree是提供给defaultdict的default_factory。根据文档介绍,如果提供该参数,参数的值就传给defaultdict构造器作为第一个参数。
如果我们以json格式打印上面代码的话(即通过print(json.dumps(users))),我们会得到下面的结果:
{"codingpy": {"username": "earlgrey"}, "python": {"username": "Guido van Rossum"}}
第二点就是我们甚至不用进行上面那样的赋值操作,只需要引用就可以创建一棵树。例如:
categories = tree() categories['Programming Languages']['Python']
categories['Python']['Standard Library']['sys']
categories['Python']['Standard Library']['os']
如果我们接着运行print(json.dumps(categories)),就会得到下面的结果:
{"Python": {"Standard Library": {"sys": {}, "os": {}}}, "Programming Languages": {"Python": {}}}
第二个奇妙之处,也被称作Autovivification,该特性最早出现在Perl中,指的是在某个数组被引用时自动创建该数组。Python本身是不支持该特性的,但可以通过本文所述的defaultdict模仿。
一行python代码实现树结构的更多相关文章
- 教你用一行Python代码实现并行(转)
教你用一行Python代码实现并行 本文教你通过一行Python实现并行化. Python在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题. ...
- 用一行Python代码制作动态二维码
在GitHub上发现了一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. GitHub网站参见:https://github.c ...
- 一行Python代码画心型
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yanlaifan/article/deta ...
- 有趣的一行 Python 代码
https://mp.weixin.qq.com/s/o9rm4tKsJeEWyqQDgVEQiQ https://mp.weixin.qq.com/s/G5F_GaUGI0w-kugOZX145g ...
- 一行python代码搞定文件分享
给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...
- 忘带U盘了??别急!一行python代码即可搞定文件传输
近日发现了python一个很有趣的功能,今天在这里给大伙儿做一下分享 需求前提 1.想要拷贝电脑的文件到另一台电脑但是又没有U盘2.手机上想获取到存储在电脑的文件3.忘带U盘- 您也太丢三落四了吧,但 ...
- 一行 Python 代码能干嘛?
Python 有很多优雅有趣的代码写法,同时还很简短,以至于当我刚开始接触这个编程语言的时候,就爱不释手.而前几天的编程语言榜单中 Python 也超越了 Java 成为了第一,挺替 Python 开 ...
- 一行 Python 代码搞定一棵树
使用 Python 内建的 defaultdict 方法可以轻松定义一个树的数据结构. 简单的说树也可以是一个字典数据结构 Python 1 def tree(): retur ...
- 一行python代码能写出啥?
1.一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http.server 8080 # python3 2. ...
随机推荐
- 写pdf文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- iOS开发-UI 从入门到精通(五)
近日在做项目的时候,为了快捷适配屏幕采用了Storyboard,添加约束以后运行后发现一个问题(下面将以普通案例展示该问题);在4.7 甚至更大的屏幕下是没有问题的,如下图(4.7屏幕): 但是放到更 ...
- iOS 为什么app都是异步编程
iOS 为什么app都是异步编程 对本文题目首先需要了解一下什么是异步编程,异步编程即多线程编程. 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径. 在具体理解多线程之前先看一个都理 ...
- 在xib中用KVC修改控件属性
比如我们想在xib 中设置按钮的圆角,这样的话我们就可以在xib文件中进行修改,具体操作如下 实现效果,如下
- vim easy-align插件使用
https://github.com/junegunn/vim-easy-align 用vundle安装, 添加下面到vimrc Plugin 'junegunn/vim-easy-align' &q ...
- MS SQL巡检系列——检查数据库上一次DBCC CHECKDB的时间
DBCC CHECKDB检查指定数据库中的所有对象的逻辑和物理完整性,具体请参考MSDN文档.我们必须定期对数据库做完整性检查(DBCC CHECKDB),以便能及时发现一些数据库损坏(Corrupt ...
- SQL Server 2008 R2——用CTE进行递归计算求解累计值
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- openstack-swift云存储部署(二)
接上篇,swift-proxy和swift-store的安装 先说一下服务器分配 swift-proxy和keystone部署在192.168.25.11 swift-store是两台 分别是192 ...
- WPF 自定义Expander
自定义Exander,收缩侧边栏 样式如下 <Grid> <Grid.Resources> <ControlTemplate x:Key="ExpanderCo ...
- android 遇到问题未处理
在gridview 全屏,然后上面增加一个悬浮按钮,这样的布局如何设置 问题点,用相对布局,在代码寻找gridview的id时就报错了