You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按键分组聚合字典列表并计算值的平均值?

问题

我有如下字典列表:

dict_lst = [{'ecs_service': {'bedstock-service': 0.6071428571428571}}, {'ecs_cluster': {'petardeer': 0.671957671957672}}, {'approval': {'yes': 0.6507936507936508}}, {'ecs_service': {'bedstock-service': 0.6180555555555555}}, {'ecs_cluster': {'tesg6': 0.6888888888888888}}, {'ecs_service': {'tickly-service-2': 0.6696428571428571}}, {'ecs_service': {'chagan-service-2': 1.0}}, {'ecs_cluster': {'chagan': 0.875}}, {'ecs_service': {'thioantimoniate-service': 0.6956521739130435}}, {'ecs_cluster': {'pinfish': 0.7619047619047619}}, {'ecs_service': {'biliously-service': 0.6694677871148459}}, {'ecs_cluster': {'test-cluster-4': 0.6904761904761904}}, {'ecs_service': {'chagan-service': 0.8857142857142858}}, {'ecs_cluster': {'chagan': 1.0}}, {'ecs_cluster': {'bedstock': 0.6212121212121212}}, {'approval': {'yes': 0.6161616161616161}}, {'ecs_service': {'bedstock-service': 0.8113636363636364}}, {'ecs_cluster': {'test-cluster-4': 0.6024531024531025}}, {'approval': {'yes': 0.6161616161616161}}, {'ecs_service': {'chagan-service-2': 0.7430555555555555}}, {'ecs_cluster': {'chagan': 0.75}}, {'ecs_service': {'chagan-service-2': 0.968421052631579}}, {'ecs_cluster': {'chagan': 0.8631578947368421}}, {'ecs_service': {'tickly-service': 0.6761904761904761}}, {'ecs_cluster': {'test-cluster-4': 0.638095238095238}}, {'ecs_cluster': {'unsaturation': 0.6428571428571429}}, {'ecs_service': {'coracopectoral-service': 0.6558091031775243}}, {'ecs_service': {'chagan-service-2': 0.7113095238095237}}, {'ecs_cluster': {'chagan': 0.7380952380952381}}, {'ecs_service': {'chagan-service-2': 0.7183641975308642}}, {'ecs_cluster': {'chagan': 0.7407407407407408}}, {'ecs_service': {'chagan-service-2': 0.9185185185185185}}, {'ecs_cluster': {'chagan': 0.8444444444444446}}, {'ecs_service': {'biliously-service': 0.6078431372549019}}, {'ecs_cluster': {'hirsel': 0.642483660130719}}, {'ecs_service': {'coracopectoral-service-2': 0.6327972709551657}}, {'ecs_service': {'chagan-service-2': 0.6928763440860215}}, {'ecs_cluster': {'chagan': 0.7311827956989246}}, {'ecs_service': {'chagan-service-2': 0.6732142857142858}}, {'ecs_cluster': {'chagan': 0.7238095238095239}}, {'ecs_service': {'chagan-service-2': 0.8941176470588236}}, {'ecs_cluster': {'chagan': 0.8352941176470589}}, {'ecs_service': {'coracopectoral-service-2': 0.6192645074224021}}, {'ecs_service': {'chagan-service-2': 0.6575854700854701}}, {'ecs_cluster': {'chagan': 0.717948717948718}}, {'ecs_service': {'chagan-service-2': 0.6478174603174603}}, {'ecs_cluster': {'chagan': 0.7142857142857143}}, {'ecs_service': {'chagan-service-2': 0.6343085106382979}}, {'ecs_service': {'chagan-service-2': 0.6367753623188406}}, {'ecs_cluster': {'chagan': 0.7101449275362318}}, {'ecs_service': {'chagan-service-2': 0.6195987654320988}}]

我希望按以下方式聚合这些字典:先按最外层键分组,再按内层键分组,然后计算值的平均值。例如,若列表中有如下三个字典:

[{'ecs_service': {'bedstock-service': 0.6}},
 {'ecs_service': {'bedstock-service': 0.2}},
 {'ecs_service': {'bedstock-service': 0.9}}]

期望得到结果:

{'ecs_service': {'bedstock-service': 0.57}}

其他键也按此规则处理。我尝试使用以下代码实现:

final = {}
for d in test:
    for k, v in d.items():
        temp = defaultdict(list)
        for l, p in v.items():
            temp[l].append(p)
        final[k] = temp

但仅能得到最后一条条目,请问如何优雅地实现这种字典合并?

解决方案

你的代码问题在于每次遍历字典时,都会重新创建temp = defaultdict(list)并直接覆盖final[k],导致之前收集的数据被清空,最终只保留了最后一条数据的结果。

可以用**嵌套的defaultdict**先收集所有数值,再统一计算平均值,实现步骤如下:

  1. 导入collections.defaultdict,创建两层默认字典:外层键对应最外层类型(如ecs_service),内层键对应具体服务/集群名称,值为存储所有对应数值的列表。
  2. 遍历原字典列表,将每个数值添加到对应层级的列表中。
  3. 遍历收集好的嵌套字典,计算每个内层列表的平均值,按需保留小数精度,生成最终结果。

完整代码:

from collections import defaultdict

# 你的原字典列表
dict_lst = [{'ecs_service': {'bedstock-service': 0.6071428571428571}}, ...]

# 第一步:收集所有数值
aggregator = defaultdict(lambda: defaultdict(list))
for d in dict_lst:
    for outer_key, inner_dict in d.items():
        for inner_key, value in inner_dict.items():
            aggregator[outer_key][inner_key].append(value)

# 第二步:计算平均值并生成结果
final_result = {}
for outer_key, inner_data in aggregator.items():
    final_result[outer_key] = {}
    for inner_key, values in inner_data.items():
        avg = sum(values) / len(values)
        final_result[outer_key][inner_key] = round(avg, 2)  # 保留两位小数

print(final_result)

运行后会得到符合预期的聚合结果,比如ecs_service下的bedstock-service会计算三次数值的平均值并保留两位小数,和示例一致。

内容的提问来源于stack exchange,提问作者SteveS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:10:24