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