我必须在编码我的研究经常这样做。您将需要使用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级字典,你必须进行排序和转储 一切都变成清单(N + 1)的形式元组[key_1,key_2, ...,key_n,值]。
- 然后,初始化n级词典, 您只需键入“defaultdict(lambda:”(减去引号)n-1次, 粘住“defaultdict(list)”(或其他某种数据类型)结束, 关闭括号
- 追加到列表中有一个for循环*注意:当你去访问在最低级别的数据值 ,你可能会输入my_dict [key_1] [key_2] [0]获得实际值,而不仅仅是 类型的数据的描述。
- *编辑:当你的字典和你想要的一样大时,设置 default_fact ory属性为None。
如果您还没有设置default_factory为无,您可以通过键入类似my_dict [key_1] [key_2] [...] [new_key] = NEW_VALUE,或使用后添加到您的嵌套字典append()命令。只要您通过这些赋值形式添加的字符不是自己嵌套的,您甚至可以添加其他字典。
* 警告!该代码片段中新添加的最后一行,您将default_factory属性设置为None,其中超级重要。你的电脑需要知道你什么时候添加到你的字典,否则它可能会继续在后台分配内存,以防止buffer overflow,吃掉你的RAM,直到程序停止。这是一种memory leak。在我写了这个答案后,我很难学会这一点。这个问题困扰了我好几个月,我甚至不认为我是最后弄清楚的人,因为我不了解内存分配的任何内容。
您的意思是在您的时间编码和维护方面“有效”,还是根据CPU时间执行它? – abarnert 2013-02-28 23:37:39
对不起,好点,编码和维护... – Dnaiel 2013-02-28 23:38:05