は、私は、次の辞書のようなテキスト含む「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つずつ返すのではなく、変換後にすべての辞書を返すことを本当に望んでいます。誰かが私のコードを修正するのを助けてくれますか?
'dc [k] = to_unicode(v)'? – jonrsharpe
@jonrsharpe私がこの行で使った 'unicode'は、組み込み関数で、vをunicode型に変換し、それを対応するキーに割り当てます。 –
しかし、再帰呼び出しのたびに「マスターコピー」に戻すのではなく、サブツリーの新しいコピーを作成し、その一部を更新します。したがって、上記の私の提案。いくつかの 'print'sを投げて何が起きているのかを見てください。 – jonrsharpe