"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Python3のネストした辞書の初期化・全件処理・JSON保存・復元

f:id:arakan_no_boku:20190427205325j:plain

目次

ネストした辞書の事例 

 pythonのネストした辞書の扱い方をまとめておきます

例えば、「A,B,C,Dの4つのテキストデータに登場する単語の割合をそれぞれ保持する」みたいなことをする場合、以下のようにキーが2段階の辞書に収めることになります。

これを「ネストした辞書」とよんでます。

word_dic['単語']['A']  = 0.035

word_dic['単語']['B']  = 0.236

word_dic['単語']['C']  = 0.432

word_dic['単語']['D']  = 0.065

こういう「ネストした辞書」は、初期化・更新・一覧などで、ネストしない場合と少々勝手が違います。

これが今回のテーマです。  

ネストした辞書の初期化 :その1

2段にネストした辞書の初期化です。

{'幸せ':

  {'pcount': 0, 'ncount': 0, 'prate': 0, 'nrate': 0}

}

setdefault()を使うスタンダードな方法です。

keyA = 'pcount'
keyB = 'ncount'
keyC = 'prate'
keyD = 'nrate'
word = '幸せ'

word_dic = {}
word_dic.setdefault(word,{})
word_dic[word].setdefault(keyA,0)
word_dic[word].setdefault(keyB,0)
word_dic[word].setdefault(keyC,0)
word_dic[word].setdefault(keyD,0)

 

ネストした辞書の初期化:その2 

__missing__を実装した拡張dictクラスを作る方法です。

class MyDict(dict):
def __missing__(self,key):
    v = self[key] = type(self)()
    return v

 

例えば、上記のようにクラスを作っておくわけです。 

そすすると、以下のように初期化できるようになります。

w_dic = MyDict()
w_dic[word]
w_dic[word][keyA] = 0
w_dic[word][keyB] = 0
w_dic[word][keyC] = 0
w_dic[word][keyD] = 0
 

自分は、「その1」のsetdefaultを使うやり方の方を使う頻度は多いです。

ですが、3段4段と複雑なネストになると「その2」のやり方でないと、ソースがグチャグチャするかなとは思います。 

ネストした辞書の全件を処理

 ネストした辞書をforループでまわすときは、再帰で処理してやる必要があります。 

とりあえず、全部の要素を書き出す処理はこんな感じで、関数にして、インスタンスを調べて辞書だったら、再帰呼出しです。

def recursive_dict(argd):
    for k in sorted(argd.keys(),reverse=False):
        if(isinstance(argd[k],dict)):
            recursive_dict(argd[k])
        else:
            print("key is {0}/value is{1}".format(k,argd[k]))

 

この出力はこんな感じになります。

key is ncount/value is0.7332
key is nrate/value is0.4568
key is pcount/value is20
key is prate/value is12
key is ncount/value is0
key is nrate/value is0
key is pcount/value is0
key is prate/value is0

ネストした辞書をJSON形式でファイルに保存 

ネストした辞書は、JSON形式で保存しておくと、復元も超簡単です。 

まず、保存します。

import json
fw = open('test.json','w')
json_data = json.dump(w_dic,fw,indent=4)
fw.close()

 

これだけで、test.jsonというファイルがカレントフォルダにできます。

保存したファイルからネストした辞書を復元 

こんどは、保存したファイルから辞書を復元します。

fr = open('test.json','r')
r_dic = json.load(fr)
fr.close()

 

これでr_dicに、辞書が復元できてます。

{'幸せ': {'pcount': 20, 'ncount': 0.7332, 'prate': 12, 'nrate': 0.4568}, '当たり前': {'pcount': 20, 'ncount': 0.7332, 'prate': 12, 'nrate': 0.4568}} 

これくらいできれば、ネストした辞書を使って、普通のことはできます。

ではでは。