Python:如何修改嵌套字典中的值并返回整个dict

时间:2016-08-17 20:13:01

标签: python dictionary unicode

想象一下,我有一个名为'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'给出了与第一个完全相同的结果。我想这个问题既可以在深度复制中发生,也可以在函数返回的方式中发生,甚至两者兼而有之。我真的希望整个字典在转换后返回,而不是一次产生一个项目。请问有人帮我纠正我的代码吗?

1 个答案:

答案 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