Python如何建立多层字典

Posted 小鱼圆又圆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python如何建立多层字典相关的知识,希望对你有一定的参考价值。

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

 

python 如何对嵌套字典里的数据进行添加和删除?

删除一个值,只要指定对应键就可以:dict.pop(types)
如果types键的值还是一个字典,即1:1:'a',2:'b',3:'c',2:4:'d',5:'e',6:'f'
那么删除2中的4:‘d’,怎么操作?
要修改2中的5:'e'为5:'w',怎么实现啊,求助。。

>>> data = 1: 1:'a',2:'b',3:'c', 2: 4:'d',5:'e',6:'f'
>>> data
1: 1: 'a', 2: 'b', 3: 'c', 2: 4: 'd', 5: 'e', 6: 'f'
>>> del data[2][4]
>>> data
1: 1: 'a', 2: 'b', 3: 'c', 2: 5: 'e', 6: 'f'
>>>
>>> data[2][5] = 'w'
>>> data
1: 1: 'a', 2: 'b', 3: 'c', 2: 5: 'w', 6: 'f'
>>>

追问

请问在.py文件中创建一个三层嵌套的字典,能不能用类似创建三维数组的方法呢?

追答

从某个方面讲是的,但又不一样。
一般概念上的几维数组在特定维度上的长度是定长的,通过位置坐标访问。
而字典的是以任意唯一值为访问凭据的。

参考技术A

那就嵌套操作呗

先取键2的值,是一个字典;再对该字典做pop操作。

a = 1:1:'a',2:'b',3:'c', 2:4:'d',5:'e',6:'f'
a[2].pop(4)
print a[2]
a[2][5] = 'W'
print a[2]

参考技术B 方法:
del dict2['name']#删除键为“name”的条目。
dict2.clear()#删除 dict2 中所有的条目
del dict2#删除整个 dict2 字典
dict2.pop('name')#删除并返回键为“name”的条目

以上是关于Python如何建立多层字典的主要内容,如果未能解决你的问题,请参考以下文章

Python题目2:多层菜单,进入和退出(字典)

python 如何对嵌套字典里的数据进行添加和删除?

python中字典的建立

Python之多层菜单(第1天)

使用EA生成多层次的代码框架

使用jsonpath解析多层嵌套的json响应信息