楼主: z74646
1023 0

[其他] Python开发丨一行代码实现树结构 [推广有奖]

  • 0关注
  • 1粉丝

本科生

75%

还不是VIP/贵宾

-

威望
0
论坛币
300 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
890 点
帖子
55
精华
0
在线时间
12 小时
注册时间
2014-2-26
最后登录
2016-7-2

楼主
z74646 发表于 2016-4-21 22:58:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用。一颗树可以简单的表示为根, 左子树, 右子树。 而左子树和右子树又可以有自己的子树。这似乎是一种比较复杂的数据结构,那么真的能像我们在标题中所说的那样,用一行Python代码就可以实现吗?

一行代码实现?

由于树形结构的外层和内层有着相似的结构,所以多可以用递归的方式定义树。再利用Python中提供的 defaultdict ,我们就可以很轻松地定义树了,而且只有一行代码。

from collections import defaultdict

def tree(): return defaultdict(tree)

更多代码欢迎访问python视频教程http://www.maiziedu.com/course/python/

具体效果演示

这样实现的树有两个奇妙之处,第一点是我们不需要创建节点,就可以直接引用它们。例如:

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 collections Programming categories Collection 开发

已有 1 人评分经验 论坛币 收起 理由
三世相思2013 + 20 + 20 精彩帖子

总评分: 经验 + 20  论坛币 + 20   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 04:56