首页 > 编程语言 >Python如何建立多层字典

Python如何建立多层字典

时间:2023-04-21 18:01:15浏览次数:29  
标签:defaultdict 示例 Python self 多层 dfd 节点 字典

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

相关文章

  • 经典的Python小游戏值得收藏
    最近在github上发现用Python开发的多款经典小游戏。这个必须要推荐给大家!可以针对Python2和Python3(到Python的3.7)项目地址:grantjenks/free-python-games​github.com/grantjenks/free-python-games绘画板在屏幕上画线和形状。单击以标记形状的开始,然后再次单击以标记其结束。......
  • python调用imgkit将html转图片pdf问题实例wkhtmltox
    wkhtmltox的下载地址:https://wkhtmltopdf.org/downloads.html或者:https://github.com/wkhtmltopdf/wkhtmltopdf0.12.6版本按网络上的教程会出现一个错误:IOError:wkhtmltopdfexitedwithnon-zerocode1.error:[blank]解决方法参见:https://stackoverflow.com/questions/......
  • Python用哈希算法查找相似图片(包括不同分辨率,不同大小,不同格式的图片)
    #-*-coding:utf-8-*-'''Python用哈希算法查找相似图片并放入[_df]的文件夹中相似图片包括不同分辨率,不同大小,不同格式,只要图片相似就会算重复文件安装cv2pipinstallopencv-python'''importosimportcv2importnumpyasnpimportshutilimportrandomclas......
  • 【四二学堂】Python数据可视化-饼形图
    #用饼形图来统计学生成绩等级占比importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltlabel=['A','B','C','D']percent=[25,54,16,5]#explode=[0,0.2,0,0]explode=[0,0,0,0.1]plt.axes(aspect=1)plt.pie(x=percent,la......
  • 【四二学堂】python四子连珠游戏-4(落下棋子后位置记录下来。保证每个棋子能够落在准确
    代码:fromtkinterimport*importtime#画布#棋盘#鼠标左键绑定事件#落下棋子后位置记录下来。保证每个棋子能够落在准确的位置上。classGame:def__init__(self):#self.ball=ballself.clsposition=Clsposition()self.tk=Tk()......
  • 【四二学堂】Python数据可视化-线性图
    importmatplotlib.pyplotaspltimportnumpyasnpplt.rcParams['font.sans-serif']=['MicrosoftYaHei']#识别汉字x=np.linspace(0,2,50)#代表当前网线上有的点的number(0,2)代表x方向的起止位置分为50份plt.plot(x,x,label='北京')#Plotsomedat......
  • PYTHONPATH 环境变量
    在"PYTHONPATH"变量中,可以设置多个目录,目录之间用分号(;)分隔。如果没有设置"PYTHONPATH"变量,则默认为当前工作目录。将/path/to/directory添加到PYTHONPATH环境变量的末尾。#windowssetxPYTHONPATH/path/to/directory;%PYTHONPATH%#linuxexportPYTHONPATH=/pa......
  • 【Python】pandas 删除空值数据 dropna
    dropnaimportpandasaspdimportnumpyasnpdf=pd.DataFrame({"name":['Alfred','Batman','Catwoman'],"toy":[np.nan,'Batmobile','Bullwhip'],"......
  • 最近在研究Python如何操作手机,使用adb
    背景:我如果能写一个自动化刷战令的功能,我是不是就可以解放双手了。#工具:adb#下面是翻译的键盘事件代表的含义keycodeconstant:未知键码。*/publicstaticfinalintKEYCODE_UNKNOWN=0;/**键码常数:软左键。*通常位于手机显示屏下方,用作多功能显示屏*功能键用于选择......
  • Python程序运行原理
    Python是一种解释型语言(先编译后解释语言),不需要编译成可执行文件,而是在运行时逐行解释执行,故运行效率相比C/C++较低。Python的运行原理可以简单地概括为以下几个步骤:词法分析和语法分析:Python解释器会将源代码进行词法分析,将代码转换为一系列的Token(即词法单元)。然后,Python......