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'
>>> 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文件中创建一个三层嵌套的字典,能不能用类似创建三维数组的方法呢?
追答从某个方面讲是的,但又不一样。
一般概念上的几维数组在特定维度上的长度是定长的,通过位置坐标访问。
而字典的是以任意唯一值为访问凭据的。
那就嵌套操作呗
先取键2的值,是一个字典;再对该字典做pop操作。
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如何建立多层字典的主要内容,如果未能解决你的问题,请参考以下文章