三层嵌套字典的结构通常为外层字典的value是中层字典,中层字典的value是里层字典,我们需要处理的是里层字典中值为相同字典的键,删除重复值对应的键只保留其中一个。

需求场景说明
假设我们有如下结构的三层嵌套字典,里层字典layer3中有两个键b和d的值都是{"x": 1, "y": 2},我们的目标是删除其中一个键,只保留一个:
# 示例三层嵌套字典
data = {
"a": {
"a1": {
"b": {"x": 1, "y": 2},
"c": {"x": 3, "y": 4},
"d": {"x": 1, "y": 2}
}
}
}实现思路
要实现删除最里层值为相同字典的键,核心步骤如下:
- 先遍历外层字典,获取所有中层字典
- 遍历每个中层字典,获取其对应的里层字典
- 遍历里层字典的键值对,记录每个值对应的键列表
- 对每个值对应的键列表,只保留第一个键,删除其余键
注意事项
判断两个字典是否相同时,不能直接用is判断,因为is判断的是对象是否为同一个,而我们需要的是值完全相同。如果里层字典的值是可变对象,需要注意修改时的影响,建议先复制值再判断,避免误改原数据。
完整实现代码
下面是完整的实现代码,包含遍历和删除逻辑:
def remove_same_value_keys(nested_dict):
# 遍历外层字典
for outer_key in nested_dict:
middle_dict = nested_dict[outer_key]
# 遍历中层字典
for middle_key in middle_dict:
inner_dict = middle_dict[middle_key]
# 用来记录值对应的键列表,key为字典的元组形式(因为字典不可哈希,转成元组存储)
value_to_keys = {}
# 先收集所有键值对,避免遍历时修改字典报错
items = list(inner_dict.items())
for inner_key, inner_value in items:
# 将字典转成可哈希的元组形式作为key
value_tuple = tuple(inner_value.items())
if value_tuple not in value_to_keys:
value_to_keys[value_tuple] = [inner_key]
else:
value_to_keys[value_tuple].append(inner_key)
# 删除重复值对应的键,只保留第一个
for key_list in value_to_keys.values():
if len(key_list) > 1:
for del_key in key_list[1:]:
del inner_dict[del_key]
return nested_dict
# 测试示例
data = {
"a": {
"a1": {
"b": {"x": 1, "y": 2},
"c": {"x": 3, "y": 4},
"d": {"x": 1, "y": 2}
}
},
"e": {
"e1": {
"f": {"m": 5},
"g": {"m": 5},
"h": {"n": 6}
}
}
}
result = remove_same_value_keys(data)
print(result)代码说明
代码中先将里层字典的键值对转成列表再遍历,避免在遍历过程中修改字典导致报错。因为字典本身是不可哈希的,所以将字典的键值对转成元组作为value_to_keys的键,这样就能准确判断两个字典的值是否完全相同。最后对每个值对应的键列表,只保留第一个,删除后面的重复键,实现需求效果。
运行上述代码后,输出结果中里层字典中值为相同字典的键会被删除,只保留第一个,比如原来的b和d都对应{"x":1,"y":2},处理后只会保留其中一个。