使用 Python 内建的 defaultdict 方法可以轻松定义一个树的数据结构。

简单的说树也可以是一个字典数据结构

 
 
 
 
 

Python

 
1
def tree(): return defaultdict(tree)

这就是全部,就一行代码。

如果你继续下面的代码,需要先引入

 
 
 
 
 

Python

 
1
from collections import defaultdict

实例

JSON-esque

现在我们创建一个 JSON-esque 嵌套字典无需显式的创建子字典:

 
 
 
 
 

Python

 
1
2
3
users = tree()
users['harold']['username'] = 'hrldcpr'
users['handler']['username'] = 'matthandlersux'

然后可通过 <code>print(json.dumps(users))</code> 来打印 JSON 数据,结果如下:

 
 
 
 
 
 

Python

 
1
{"harold": {"username": "hrldcpr"}, "handler": {"username": "matthandlersux"}}

无需赋值

我们不需要通过赋值就可以创建结构:

 
 
 
 
 
 

Python

 
1
2
3
4
5
6
7
8
taxonomy = tree()
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Felidae']['Felis']['cat']
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Felidae']['Panthera']['lion']
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Canidae']['Canis']['dog']
taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Canidae']['Canis']['coyote']
taxonomy['Plantae']['Solanales']['Solanaceae']['Solanum']['tomato']
taxonomy['Plantae']['Solanales']['Solanaceae']['Solanum']['potato']
taxonomy['Plantae']['Solanales']['Convolvulaceae']['Ipomoea']['sweet potato']

要打印有好的信息,需要转成标准的字典对象:

 
 
 
 
 

Python

 
1
def dicts(t): return {k: dicts(t[k]) for k in t}

现在可通过 pprint(dicts(taxonomy)) 进行打印了:

 
 
 
 
 
 

Python

 
1
2
3
4
5
6
7
{'Animalia': {'Chordata': {'Mammalia': {'Carnivora': {'Canidae': {'Canis': {'coyote': {},
                                                                            'dog': {}}},
                                                      'Felidae': {'Felis': {'cat': {}},
                                                                  'Panthera': {'lion': {}}}}}}},
'Plantae': {'Solanales': {'Convolvulaceae': {'Ipomoea': {'sweet potato': {}}},
                           'Solanaceae': {'Solanum': {'potato': {},
                                                      'tomato': {}}}}}}

子结构也被当作是字典对象了,而叶子节点是一个空的字典对象

迭代

可以使用有趣的方法对树进行迭代。

例如我们解析一个动物的列表并添加到之前定义的 taxonomy 中,我们可以使用如下代码:

 
 
 
 
 
 

Python

 
1
2
add(taxonomy,
    'Animalia,Chordata,Mammalia,Cetacea,Balaenopteridae,Balaenoptera,blue whale'.split(','))

简化实现:

 
 
 
 
 

Python

 
1
2
3
def add(t, keys):
  for key in keys:
    t = t[key]

我们仍然无需赋值:

 
 
 
 
 
 

Python

 
1
2
3
4
5
6
7
8
{'Animalia': {'Chordata': {'Mammalia': {'Carnivora': {'Canidae': {'Canis': {'coyote': {},
                                                                            'dog': {}}},
                                                      'Felidae': {'Felis': {'cat': {}},
                                                                  'Panthera': {'lion': {}}}},
                                        'Cetacea': {'Balaenopteridae': {'Balaenoptera': {'blue whale': {}}}}}}},
'Plantae': {'Solanales': {'Convolvulaceae': {'Ipomoea': {'sweet potato': {}}},
                           'Solanaceae': {'Solanum': {'potato': {},
                                                      'tomato': {}}}}}}

结论

上面提及的这些可能用处不大,只是做了一些有意思的代码。

如果你喜欢 Python 的话,把这个当成是乐趣来理解。

一行 Python 代码搞定一棵树的更多相关文章

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

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

  2. 一行css代码搞定响应式布局

    在这篇文章中,我将教你如何使用 CSS Grid 来创建一个超酷的图像网格图,它将根据屏幕的宽度来改变列的数量.最精彩的地方在于:所有的响应特性被添加到了一行 css 代码中.这意味着我们不必将 HT ...

  3. 80行Python代码搞定全国区划代码

    微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...

  4. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

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

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

  6. 一行代码搞定 FTP 服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  7. 一行代码搞定Adapter

    15年Google I/O大会发不了三个重要支持库 >Material design (Android Support Design) >百分比布局:Percent support lib ...

  8. Asp.Net Core 轻松学-一行代码搞定文件上传 JSONHelper

    Asp.Net Core 轻松学-一行代码搞定文件上传   前言     在 Web 应用程序开发过程中,总是无法避免涉及到文件上传,这次我们来聊一聊怎么去实现一个简单方便可复用文件上传功能:通过创建 ...

  9. 一行代码搞定所有屏幕适配AbViewUtil

    适配原理:抛弃google提供的dip理论与多套图片与布局方案,采用与UI设计师通用的px作为标准单位,原理是将UI设计师的设计图与当前查看的手机或其他设备的屏幕像素尺寸进行换算,得到缩放比例,在Ac ...

随机推荐

  1. 虚拟主机 (Virtual Host)

    虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同 ...

  2. Dell笔记本禁用触摸板的方法

    一·找到触摸板驱动所在的文件夹(其他型号 的本本,请自己探索一下,找到驱动在哪就行),一般 在 C:\program files\delltpad 中(若没有请下载安 装 ),如图: 二·双击 Del ...

  3. JS正则表达式验证数字非常全

    <script type="text/javascript"> function validate(){ var reg = new RegExp("^[0- ...

  4. Mysql监控工具小集合

    介绍一些常见的Mysql监控工具. Cacti Cacti是 一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.它通过snmpget来获取数据,使用 RRDtool绘 ...

  5. JSP-讲解(生成java类、静态导入与动态导入)

    一.JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护. JSP是HTML代码与Java代码的混合体. JSP文件通常以JSP或J ...

  6. spoj 7258 SUBLEX(SAM,名次)

    [题目链接] http://www.spoj.com/problems/SUBLEX/en/ [题意] 给定一个字符串,询问次序为k的子串. [思路] SAM,名次 建好SAM后求出每个结点根据tra ...

  7. redis命令之lrange

    LRANGE key start stop Related commands BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX ...

  8. SecureCRT中文乱码解决方法

    在windows下使用SecureCRT访问MAC主机,发现中文总是乱码.而且默认会话选项设置的字符编码就是UTF-8,和MAC主机默认字符编码一样. 后来通过设置,解决了中文乱码问题. 具体使用了两 ...

  9. 15个易遗忘的Java问题

    通常,在面试中,会遇到面试官提一些比较“偏冷”的基础知识,比如基本数据类型所占用的字节数,或者Unicode和UTF-8的区别之类的问题,这时很多应聘者会答错.还有在平常编码的过程中,很多时候会用到除 ...

  10. 百度参投 Uber中国12亿美元融资已到账

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...