我必須在編碼我的研究經常這樣做。您將需要使用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