首页 > 解决方案 > 更新一个嵌套默认字典中的特定值,但不更新其他默认字典中的特定值

问题描述

我构建了一个三级 defaultdict,如下所示:

data_dict = 
{
    "5uz7_R": {
        "section1": {
            "=": 0,
            "-": 0,
            ".": 0,
            "+": 0,
            "|": 0,
            "gaps": 0
        },
        "section2": {
            "=": 0,
            "-": 0,
            ".": 0,
            "+": 0,
            "|": 0,
            "gaps": 0
        }
    },
    "4l6r_A": {
        "section1": {
            "=": 0,
            "-": 0,
            ".": 0,
            "+": 0,
            "|": 0,
            "gaps": 0
        },
        "section2": {
            "=": 0,
            "-": 0,
            ".": 0,
            "+": 0,
            "|": 0,
            "gaps": 0
        }
    }
}

我的目标是使用 for 循环和 if 语句来更新其中一个整数值,具体取决于我在循环中的位置以及在迭代包含这些的字符串时找到的字符(=、-、+、...)人物。

我有几个单独的列表,其中包含我想要迭代的项目,并且相应的项目具有相应的索引(这是一个很长的故事......)。因此,我在每个循环中创建了一个字符串变量,该变量对应于我想要找到的连续字典键,以根据 if 语句更新嵌套最深的值。它看起来像这样:

for i in list1:
    dict_lvl1 = a_function_of_i  # a string, like "5uz7_R"
    for j in list2:
        dict_lvl2 = a_function_of_j  # a string, like "section1"
        for n in range(x):
            if string[n] == '=':
                data_dict[dict_lvl1][dict_lvl2]["="] += 1
            elif string[n] == '-':
                data_dict[dict_lvl1][dict_lvl2]["-"] += 1
            ...

问题是:如果遇到“=”(或任何 lvl3 字符),“=”的值会随处更新。

我觉得“main_dict[variable][variable]["character"] += 1" 本质上是有缺陷的,但我想确保没有办法让代码按原样工作(因为它之前有其他用途进入那个阶段)。

我希望这是可以理解的,如果不是,我真诚地道歉!

****编辑****

data_dict 是用 collections.defaultdict 通过从现有列表的项目中获取键值来构造的:

symbol_dict = defaultdict(int)
section_dict = defaultdict(dict)
data_dict = defaultdict(dict)

[symbol_dict[i] for i in symbol_list]

for j in section_list:
    section_dict[j]=symbol_dict

for k in pdb_list:
    data_dict[k] = section_dict

print(json.dumps(data_dict, indent=4))

print 语句生成 data_dict 如开头所示。

标签: pythondictionarydefaultdict

解决方案


对我来说,看起来您正在为所有 section_dicts 分配相同的 symbol_dict。尝试将其构建为:

from copy import deepcopy

for j in section_list:
    section_dict[j]=deepcopy(symbol_dict)

for k in pdb_list:
    data_dict[k] = deepcopy(section_dict)

推荐阅读