使用字典的get方法
使用字典的底层方法get设置默认值为一个空字典,即可创建下层字典:
a = {} a["testkey"] = a.get("testkey", {})
优点是不需要导入其他包;
缺点是拓展性太差,几乎只能用在二层字典的创建上,层数越多,代码量越大。
使用collections.defaultdict创建
Python自带的collections包内的defaultdict类可以用来构建多层字典
示例:
from collections import defaultdict as dfd # 2层字典 dic2 = dfd(dict) # 3层字典 dic3 = dfd(lambda: dict) # 4层字典 dic4 = dfd(lambda: dfd(lambda: dict))
优点是:快捷方便;
缺点是:有多少层就需要手动创建多少层(就像上面的示例那样),
defaultdict的小问题(也许是bug)
如果靠循环来嵌套,会导致defaultdict实际只有一层,下面是用循环的结果示例:
尝试用循环嵌套生成一个4层字典:
from collections import defaultdict as dfd # 层数 n = 4 # 最内层字典 a = dict # 用来做嵌套的循环 for i in range(n - 1): if a is dict: a = dfd(a) else: a = dfd(lambda: a)
# 打印测试结果 print(a) a[0] = 1 a[1][2] = 5 a[3][4][5] = 10 a[6][7][8][9] = 15 a[10][11][12][13][14] = 9923 print(a)
测试结果:
开始的几个结果看起来还正常(比如0:1, 2:5, 5:10, 9:15等等),但是到了最后一个,发现它居然有5层(我们只嵌套了4层)。
实际上,它只有一层,可以自己测试。它把所有中括号内传入的键值都放进了同一个字典。
具体什么原因导致的暂不清楚。
替代方法——使用树结构
当字典层数非常多时(比如几十层),上述方法已经不适用了,这时最好建立一个节点类和一个树类来管理所有节点,毕竟多层字典和数结构是一样的。
节点类如何创建
节点类只需要 自身值、父子列表即可。
示例:
class Nod: def __init__(self): self.father = [] self.children = [] self.value = None
树类如何创建
树类只需要通过某些值追踪到特定节点即可,有时候甚至不需要。主要作为一个管理器进行使用,方便子节点的定位。
比如给每个子节点都赋予一个独特的id,那么可以在树类内建立一个字典,键值分别是:id,节点对象。
这样查找子节点时就可以直接通过id来查找。
示例:
class Tree: def __init__(self): self.id2nod = {}
标签:defaultdict,示例,Python,self,多层,dfd,节点,字典 From: https://www.cnblogs.com/roundfish/p/17341278.html