树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用。一颗树可以简单的表示为根, 左子树, 右子树。 而左子树和右子树又可以有自己的子树。这似乎是一种比较复杂的数据结构,那么真的能像我们在标题中所说的那样,用一行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是提供给defaultdictdefault_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代码实现树结构的更多相关文章

  1. 教你用一行Python代码实现并行(转)

    教你用一行Python代码实现并行 本文教你通过一行Python实现并行化. Python在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题. ...

  2. 用一行Python代码制作动态二维码

    在GitHub上发现了一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. GitHub网站参见:https://github.c ...

  3. 一行Python代码画心型

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yanlaifan/article/deta ...

  4. 有趣的一行 Python 代码

    https://mp.weixin.qq.com/s/o9rm4tKsJeEWyqQDgVEQiQ https://mp.weixin.qq.com/s/G5F_GaUGI0w-kugOZX145g ...

  5. 一行python代码搞定文件分享

    给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...

  6. 忘带U盘了??别急!一行python代码即可搞定文件传输

    近日发现了python一个很有趣的功能,今天在这里给大伙儿做一下分享 需求前提 1.想要拷贝电脑的文件到另一台电脑但是又没有U盘2.手机上想获取到存储在电脑的文件3.忘带U盘- 您也太丢三落四了吧,但 ...

  7. 一行 Python 代码能干嘛?

    Python 有很多优雅有趣的代码写法,同时还很简短,以至于当我刚开始接触这个编程语言的时候,就爱不释手.而前几天的编程语言榜单中 Python 也超越了 Java 成为了第一,挺替 Python 开 ...

  8. 一行 Python 代码搞定一棵树

    使用 Python 内建的 defaultdict 方法可以轻松定义一个树的数据结构. 简单的说树也可以是一个字典数据结构           Python   1 def tree(): retur ...

  9. 一行python代码能写出啥?

    1.一行代码启动一个Web服务 python -m SimpleHTTPServer 8080  # python2 python3 -m http.server 8080  # python3 2. ...

随机推荐

  1. iOS简单实现毛玻璃效果

    iOS8之后有一个类 UIVisualEffectView // 毛玻璃 UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMak ...

  2. iOS 开发中的争议(一)

    序言 打算分享一些有争议的话题,并且表达一下我的看法.这是该系列的第一篇,我想讨论的是:类的成员变量应该如何定义? 在 Objective-C 的语言的早期,类的私有成员变量是只能定义在 .h 的头文 ...

  3. 【代码笔记】iOS-向服务器传JSON数据的两种方式

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  4. HTML5-01 简介

    标记语言 概述 标记语言(也称置标语言),是一种将文本及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机编码.与文本相关的其他信息(包括例如文本的结构和表示信息等)与原来的文本结合 ...

  5. CSS3 box-sizing

    请在火狐浏览器测试,其他浏览器不一定有效 <!DOCTYPE html > <html > <head> <meta charset="utf-8& ...

  6. Hadoop2.5.0 搭建实录

    目录: 第一步:准备相关材料 第二步:虚拟机环境搭建 第三步:用户信息 第四步 安装.配置Java环境 第五步 Zookeeper安装配置 第六步 Hadoop安装.配置 第七步:HBase安装部署 ...

  7. Zookeeper(一)从抽屉算法到Quorum (NRW)算法

    一.抽屉算法 抽屉算法,又名鸽巢原理,它是德国数学家狄利克雷首先明确的提出来并用以证明一些数论中的问题,因此,也称为狄利克雷原则.它是组合数学中一个重要的原理. 具体算法讲的是: 第一抽屉算法: 如果 ...

  8. 问题解决——MFC Ribbon 响应函数 错乱 执行其他函数

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  9. 今天在在linux环境下 管理自己的php项目时 删除一个分类 结果报了一个Table表名 doesn’t exist

    在百度上查了 一下  发现是是大小写的问题  在此分享一下

  10. 令人崩溃的@requestBody乱码一例

    这个问题真是让我心力憔悴了...在客户现场对接就是乱码,StringHttpConverter怎么配置都不行... 场景其实很简单:客户那头post一个http请求,包体是json字符串,我这头spr ...