想象一下,我有一个名为'test_dict.txt'的文件,其中包含以下类似字典的文本:
{
"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'中使用了递归,以便遍历最深的值。第一个'print'给出'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'}}
所以我应该真正转换为unicode类型的是两个整数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'}}
但实际上我的第二个'print'给出了与第一个完全相同的结果。我想这个问题既可以在深度复制中发生,也可以在函数返回的方式中发生,甚至两者兼而有之。我真的希望整个字典在转换后返回,而不是一次产生一个项目。请问有人帮我纠正我的代码吗?
答案 0 :(得分: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