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

如何合并Python字典中按小时分组的嵌套键值对

合并按小时分组的区域统计字典

假设你的原始字典结构类似这样(键是(小时, 区域索引)元组,值包含区域的面积和平均强度):

original_dict = {
    (0, 0): {'area': 120, 'mean_intensity': 45.2},
    (0, 1): {'area': 85, 'mean_intensity': 52.7},
    (1, 0): {'area': 98, 'mean_intensity': 48.1},
    (1, 1): {'area': 112, 'mean_intensity': 50.3},
    (1, 2): {'area': 76, 'mean_intensity': 46.8}
}

你可以通过遍历原字典,按小时分组聚合统计数据,实现步骤如下:

1. 初始化合并结果字典

创建一个空字典,用来存储每个小时的汇总统计:

merged_dict = {}

2. 遍历原字典并聚合数据

遍历每个键值对,提取小时信息,累加对应统计项:

for (hour, _), region_data in original_dict.items():
    # 提取当前区域的面积和平均强度
    area = region_data['area']
    mean_int = region_data['mean_intensity']
    
    if hour not in merged_dict:
        # 首次遇到该小时,初始化统计项
        merged_dict[hour] = {
            'region_count': 1,
            'total_area': area,
            'sum_intensity': mean_int,
            'sum_weighted_intensity': mean_int * area
        }
    else:
        # 该小时已存在,更新统计项
        merged_dict[hour]['region_count'] += 1
        merged_dict[hour]['total_area'] += area
        merged_dict[hour]['sum_intensity'] += mean_int
        merged_dict[hour]['sum_weighted_intensity'] += mean_int * area

3. 计算最终的平均强度

根据需求计算两种常见的平均强度:

  • 区域算术平均强度:所有区域平均强度的平均值
  • 面积加权平均强度:整个小时内所有像素的平均强度(更能反映整体强度水平)
for hour in merged_dict:
    stats = merged_dict[hour]
    # 计算区域算术平均强度
    stats['mean_intensity_regions'] = stats['sum_intensity'] / stats['region_count']
    # 计算面积加权平均强度
    stats['mean_intensity_weighted'] = stats['sum_weighted_intensity'] / stats['total_area']
    # 删除临时统计项,保持字典整洁
    del stats['sum_intensity'], stats['sum_weighted_intensity']

最终结果

处理后的merged_dict结构如下:

{
    0: {
        'region_count': 2,
        'total_area': 205,
        'mean_intensity_regions': 48.95,
        'mean_intensity_weighted': 48.2341...
    },
    1: {
        'region_count': 3,
        'total_area': 286,
        'mean_intensity_regions': 48.4,
        'mean_intensity_weighted': 48.6713...
    }
}

补充说明

  • 如果原始数据包含其他统计项,只需在初始化和更新阶段对应添加累加逻辑即可。
  • 若需保留每个小时下的所有区域详细数据,可先将每个小时对应的值设为列表收集数据,再做聚合统计:
merged_dict = {}
for (hour, idx), region_data in original_dict.items():
    if hour not in merged_dict:
        merged_dict[hour] = []
    merged_dict[hour].append(region_data)

# 对每个小时的区域列表做统计
for hour, regions in merged_dict.items():
    region_count = len(regions)
    total_area = sum(r['area'] for r in regions)
    mean_regions = sum(r['mean_intensity'] for r in regions) / region_count
    mean_weighted = sum(r['mean_intensity'] * r['area'] for r in regions) / total_area
    merged_dict[hour] = {
        'region_count': region_count,
        'total_area': total_area,
        'mean_intensity_regions': mean_regions,
        'mean_intensity_weighted': mean_weighted
    }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:20:36