python dict初始化大小_在Python中初始化/创建/填充Dict的Dict

我必须在为我的研究编写代码时经常这样做。您将希望使用defaultdict包,因为它允许您添加键:值对在任何级别上,通过简单的分配。回答完你的问题我会给你看的。这是直接来源于我的一个程序。关注最后4行(不是注释)并在块的其余部分跟踪变量,看看它在做什么:from astropy.io import fits #this package handles the image data I work with

import numpy as np

import os

from collections import defaultdict

klist = ['hdr','F','Ferr','flag','lmda','sky','skyerr','tel','telerr','wco','lsf']

dtess = []

for file in os.listdir(os.getcwd()):

if file.startswith("apVisit"):

meff = fits.open(file, mode='readonly', ignore_missing_end=True)

hdr = meff[0].header

oid = str(hdr["OBJID"]) #object ID

mjd = int(hdr["MJD5"].strip(' ')) #5-digit observation date

for k,v in enumerate(klist):

if k==0:

dtess = dtess+[[oid,mjd,v,hdr]]

else:

dtess=dtess+[[oid,mjd,v,meff[k].data]]

#header extension works differently from the rest of the image cube

#it's not relevant to populating dictionaries

#HDUs in order of extension no.: header, flux, flux error, flag mask,

# wavelength, sky flux, error in sky flux, telluric flux, telluric flux errors,

# wavelength solution coefficients, & line-spread function

dtree = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

for s,t,u,v in dtess:

dtree[s][t][u].append(v)

#once you've added all the keys you want to your dictionary,

#set default_factory attribute to None

dtree.default_factory = None

这是摘要版本。在首先,对于一个n级字典,必须进行排序和转储

所有内容都以[key_1,key_2,

... ,键\n,值]。在

然后,要初始化n级字典,

只需输入“defaultdict(lambda:”(减去引号)n-1次,

在末尾粘贴“defaultdict(list)”(或其他数据类型),然后

关闭括号。在

用for循环附加到列表。*注意:当您访问数据值时

你可能会有最低档的U键

[…][key_n][0]获取实际值,而不仅仅是数据的描述

在其中键入。在

*编辑:当你的字典足够大的时候,设置

默认的“工厂”属性为“无”。在

如果尚未将default_factory设置为None,则可以稍后通过键入my_dict[key_1][key_2][…][new_key]=new_value,或使用append()命令来添加到嵌套字典中。您甚至可以添加额外的字典,只要您通过这些赋值形式添加的字典本身不是嵌套的。在

在*

警告!该代码段中新添加的最后一行(在该行中,您将default_factory属性设置为None)是super important。你的电脑需要知道你什么时候完成了字典的添加,否则它可能会继续在后台分配内存以防止buffer overflow,耗尽你的内存,直到程序停止运行。这是memory leak的类型。在我写下这个答案后的一段时间里,我艰难地学会了这一点。这个问题困扰了我几个月,我甚至不认为我是最终解决它的人,因为我对内存分配一无所知。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值