2016-08-17 4 views
0

は、私は、次の辞書のようなテキスト含む「test_dict.txt」という名前のファイル持っていることを想像して返されました:あなたが見ることができるようにPythonの:どのようにネストされた辞書内の値を変更し、全体のdictは

{ 
    "subdic1" : { 
     "a_string" : "something1", 
     "a_integer" : 16, 
     "a_list" : [ 
      "str_1", 
      "str_2" 
     ] 
    }, 
    "subdic2" : { 
     "a_string" : "something2", 
     "a_integer" : 32, 
     "a_list" : [ 
      "str_3", 
      "str_4" 
     ] 
    } 
} 

を入れ子にされた辞書があること。私がしたいのは、いくつかの比較目的のために、最も深い値( "something1"、16、["str_1"、 "str_2"]など)をUnicode型オブジェクトに変換することです。

import json 
from copy import deepcopy 

def to_unicode(d): 
    dc = deepcopy(d) 
    for k,v in dc.iteritems(): 
     if isinstance(v, dict): 
      to_unicode(v) 
     else: 
      dc[k] = unicode(v) 
    return dc 

dict_fname = 'test_dict.txt' 
with open(dict_fname) as dict_fd: 
    dic = json.load(dict_fd) 
print dic 
print to_unicode(dic) 

は、私が最も深い値に横断するために、私の関数「to_unicode」で再帰を使用:ここに私の試みです。次のように最初の「印刷」が「json.load」の結果を与える操作:私は本当にユニコード型に変換する必要がありますどのようなので

{u'subdic1': {u'a_list': [u'str_1', u'str_2'], u'a_integer': 16, u'a_string': u'something1'}, u'subdic2': {u'a_list': [u'str_3', u'str_4'], u'a_integer': 32, u'a_string': u'something2'}} 

は二つの整数16と32です。しかし、私はまだの機能が欲しいです簡単にするために、各レベルの辞書内の各値を変換します。二つの数値はu'16' とu'32' に変換されることになっているので、関数によって返された辞書オブジェクトは、次のように印刷する必要があります。

{u'subdic1': {u'a_list': [u'str_1', u'str_2'], u'a_integer': u'16', u'a_string': u'something1'}, u'subdic2': {u'a_list': [u'str_3', u'str_4'], u'a_integer': u'32', u'a_string': u'something2'}} 

しかし、実際には、私の2番目の 『印刷』は提供します最初のものと全く同じ結果です。私は問題がdeepcopyまたは関数の復帰の方法、またはその両方で発生すると思います。私は実際には、1つのアイテムを1つずつ返すのではなく、変換後にすべての辞書を返すことを本当に望んでいます。誰かが私のコードを修正するのを助けてくれますか?

+0

'dc [k] = to_unicode(v)'? – jonrsharpe

+0

@jonrsharpe私がこの行で使った 'unicode'は、組み込み関数で、vをunicode型に変換し、それを対応するキーに割り当てます。 –

+1

しかし、再帰呼び出しのたびに「マスターコピー」に戻すのではなく、サブツリーの新しいコピーを作成し、その一部を更新します。したがって、上記の私の提案。いくつかの 'print'sを投げて何が起きているのかを見てください。 – jonrsharpe

答えて

0

@jonrsharpeによれば、マスターや元のコピーに物事を割り当てるだけでいいです。あなたが提供したコードを反復するいくつかのスパゲッティがあります:

def to_unicode(d, target_dict={}): 
    for k,v in d.iteritems(): 
     if isinstance(v, dict): 
      target_dict = to_unicode(v, target_dict) 
     else: 
      target_dict[k] = unicode(v) 
    return target_dict 
関連する問題