研究のコーディングでは、これを日常的に行う必要があります。簡単な代入によって任意のレベルでキーと値のペアを追加できるため、defaultdict パッケージを使用することをお勧めします。あなたの質問に答えた後、あなたに見せます。これは、私のプログラムの 1 つから直接供給されます。最後の 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, ... , key_n, value] の形式で (n+1) タプルのリストにすべてを並べ替えてダンプする必要があります。
- 次に、n レベルの辞書を初期化するには、"defaultdict(lambda: " (マイナス引用符) を n-1 回入力し、最後に "defaultdict(list)" (またはその他のデータ型) を貼り付けて、括弧。
- for ループでリストに追加します。*注意: 最下位レベルのデータ値にアクセスする場合、おそらく my_dict[key_1][key_2] [...][key_n][0] と入力して、データの説明だけでなく実際の値を取得する必要があります。そこに入力します。
- *編集: 辞書が必要なだけ大きい場合は、default_factory 属性を None に設定します。
default_factory を None に設定していない場合は、後で my_dict[key_1][key_2][...][new_key]=new_value のように入力するか、append() コマンドを使用して、ネストされた辞書に追加できます。これらの代入形式で追加した辞書自体がネストされていない限り、追加の辞書を追加することもできます。
*
警告!default_factory 属性を None に設定した、そのコード スニペットの新しく追加された最後の行は非常に重要です。PC は、辞書への追加がいつ完了したかを知る必要があります。そうしないと、バックグラウンドでメモリの割り当てを続けてバッファ オーバーフローを防ぎ、プログラムが停止するまで RAM を食い尽くしてしまう可能性があります。これは一種のメモリ リークです。この回答を書いた後、私はこれを苦労して学びました。この問題は数か月間私を悩ませましたが、メモリ割り当てについて何も理解していなかったので、最終的にそれを理解したのは私ではなかったと思います.