在一个嵌套的 defaultdict 中更新特定值,但不在其他 defaultdict 中更新

Updating specific value in one nested defaultdict but not in other defaultdicts

我构建了一个三级 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))

打印语句生成data_dict如开头所示。

对我来说,您似乎将相同的 symbol_dict 分配给所有 section_dicts。尝试将其构建为:

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)