Python如何建立多层字典

发布时间 2023-04-21 18:00:50作者: 小鱼圆又圆

使用字典的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 = {}