Python/Django 合并两个字典列表并按日期累加数据字段值
解决方案
通过以day字段为键构建中间聚合字典的方式实现合并,可直接运行的代码如下:
# 示例输入 list_one = [ {'day': '2021-09-05 00:00:00+02:00', 'airtime_total_for_day': '650.00', 'data_total_for_day': '0'}, {'day': '2021-09-16 00:00:00+02:00', 'airtime_total_for_day': '124.20', 'data_total_for_day': '20.00'}, ] list_two = [ {'day': '2021-09-10 00:00:00+02:00', 'data_bundle_total_for_day': '100.00'}, {'day': '2021-09-16 00:00:00+02:00', 'data_bundle_total_for_day': '50.00'}, {'day': '2021-09-18 00:00:00+02:00', 'data_bundle_total_for_day': '45.00'}, ] # 中间聚合字典,key为日期,value为合并后的条目 merged_map = {} # 处理第一个列表的所有条目 for item in list_one: day_val = item['day'] merged_map[day_val] = item.copy() # 将数据量转为float类型方便后续计算 merged_map[day_val]['data_total_for_day'] = float(merged_map[day_val]['data_total_for_day']) # 处理第二个列表的所有条目 for item in list_two: day_val = item['day'] bundle_val = float(item['data_bundle_total_for_day']) if day_val in merged_map: # 同日期条目叠加数据量 merged_map[day_val]['data_total_for_day'] += bundle_val else: # 新增不存在的日期条目 merged_map[day_val] = { 'day': day_val, 'airtime_total_for_day': '0.00', 'data_total_for_day': bundle_val } # 将数值转回字符串格式,和原有字段格式对齐 for entry in merged_map.values(): entry['data_total_for_day'] = f"{entry['data_total_for_day']:.2f}" # 生成最终合并列表,如需按日期排序可使用下方注释的代码替换 merged_list = list(merged_map.values()) # merged_list = sorted(merged_map.values(), key=lambda x: x['day']) # 输出验证 print(merged_list)
运行后得到的结果完全符合需求,其中2021-09-16对应的data_total_for_day值为70.00。如果不需要保留airtime_total_for_day字段,直接删除第二个列表处理逻辑中对应的赋值行即可。
内容的提问来源于stack exchange,提问作者KD1
相关产品推荐
相关产品推荐

