一行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是提供给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模仿。

时间: 2024-10-11 21:25:15

一行python代码实现树结构的相关文章

一行python代码

Life is short, just use Python. 自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是,主要是可以高效开发吧. 那一行代码可以干什么呢? 有趣 我孩子的英文名叫andy,也许当初教他写程序的时候,如果先秀一下这行代码,可能就更能激起他对代码的兴趣了. >>> print'\n'.join([''.join([('AndyLove'[(x-y)%8]if((x*0.05)**2

一行 Python 代码实现并行,骚技能,Get!

Python 在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题.常见的经典 Python 多线程.多进程教程多显得偏"重".而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容. 传统的例子 简单搜索下"Python 多线程教程",不难发现几乎所有的教程都给出涉及类和队列的例子: import os import PIL from multiprocessing import Pool from PIL

一行 Python 代码实现三分彩网站搭建并行

Python 在程序并行化方面多少有些声名狼藉.三分彩网站搭建[企鹅21717-93408]撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题.常见的经典 Python 多线程.多进程教程多显得偏"重".而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容.我并不是说使用生产者/消费者模型处理多线程/多进程任务是错误的(事实上,这一模型自有其用武之地).只是,处理日常脚本任务时我们可以使用更有效率的模型. Python学习群:556370268,这里是pyth

一行Python代码一句注释,大量美女套图等萌新来战!

效果展示: 此模板主要用于多线程套图下载,不过一般大众爬虫不用破译的都可以改改使用,附件有个美图录的例子. 每个用途 每个网址 细节都会有差异 所有带(*)的都属于DIY范畴,需要一些基本的html知识,请灵活使用. 添加了断点续传功能,文件夹名称改为套图地址: 每一句Python源代码后面都有详细注释: import requests ##参考h踢踢批://docs点python-requests.org/zh_CN/latest/user/quickstart点html from bs4 i

python基础===一行 Python 代码实现并行(转)

原文:https://medium.com/building-things-on-the-internet/40e9b2b36148 译文:https://segmentfault.com/a/1190000000414339 #from multiprocessing import Pool from multiprocessing.dummy import Pool as ThreadPool import requests urls = [ 'http://www.python.org',

一行Python代码——单词逆转

Question Given an input string, reverse the string word by word. For example, Given s = "the sky is blue", return "blue is sky the". Answer def reverseWords(s): return ' '.join(filter(lambda x:x != '', s.split(' '))[::-1]) 详解: s.split(

python cookies提取——从字符串到字典(一行Python代码)

def extract_cookies(cookie): """从浏览器或者request headers中拿到cookie字符串,提取为字典格式的cookies""" cookies = dict([l.split("=", 1) for l in cookie.split("; ")]) return cookies if __name__ == "__main__": cookie

Python代码是编译执行还是解释执行?

转载地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641 有人在讨论 Python 代码是编译执行还是解释执行?这个问题还可以换一种说法: Python 是编译型语言还是解释型语言?回答这个问题前,我们先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下次运行时无需重新编译.不过它是针对特定CPU体系的,这些目标代码只能在特定

关于python代码是编译执行还是解释执行

Python 是编译型语言还是解释型语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下次运行时无需重新编译. 不过它是针对特定CPU体系的,这些目标代码只能在特定平台执行,如果这个程序需要在另外一种 CPU 上面运行,这个代码就必须重新编译. 它不具备可移植性,但是执行速度快,C.C++这类语言属于编译型语言. 而解释型语言是在代码运行期间逐行翻译成目标机器码,下次执行时,还是需要逐