如何合并列表中同结构嵌套字典并计算指标均值?
解决方案:嵌套字典的数值收集与均值合并
假设你有如下示例数据:
# 单个字典的结构模板 ex = { "a": 1, "b": { "c": 2, "d": 3 }, "e": 4 } # 包含多个同结构字典的列表 dicts = [ {"a": 1, "b": {"c": 2, "d": 3}, "e": 4}, {"a": 3, "b": {"c": 4, "d": 5}, "e": 6}, {"a": 5, "b": {"c": 6, "d": 7}, "e": 8} ]
要实现收集对应key的数值为列表,再用均值替换列表的需求,递归是适配嵌套结构的最优方案,完整代码如下:
def merge_and_average(dict_list): if not dict_list: return {} # 第一步:递归收集所有对应key的数值为列表 def collect_values(source_dict, all_dicts): result = {} for key, value in source_dict.items(): if isinstance(value, dict): # 递归处理嵌套字典,传入所有字典中当前key对应的子字典 result[key] = collect_values(value, [d[key] for d in all_dicts]) else: # 收集所有字典中当前key的数值 result[key] = [d[key] for d in all_dicts] return result # 第二步:递归将数值列表替换为均值 def replace_with_mean(nested_dict): result = {} for key, value in nested_dict.items(): if isinstance(value, dict): result[key] = replace_with_mean(value) else: # 计算均值,空列表返回0.0避免除以0 result[key] = sum(value) / len(value) if value else 0.0 return result # 先收集数值列表,再替换为均值 collected_data = collect_values(dict_list[0], dict_list) return replace_with_mean(collected_data)
使用示例
# 调用函数处理示例列表 merged_result = merge_and_average(dicts) print(merged_result)
输出结果:
{'a': 3.0, 'b': {'c': 4.0, 'd': 5.0}, 'e': 6.0}
代码说明
- 递归逻辑适配任意深度的嵌套字典,只要输入列表中所有字典的结构完全一致即可正常工作。
collect_values以第一个字典为结构模板,遍历每个层级的key,从所有输入字典中提取对应位置的数值,构建出值为列表的嵌套结构。replace_with_mean遍历收集后的结构,将每个数值列表替换为其算术均值,空列表场景返回0.0避免运行时错误。
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

