如何合并列表中同值字典?按FID和LEFT分组汇总时间
解决方案
明确需求:按FID和LEFT分组,累加同组的LTIME,同时将同FID下RIGHT匹配LEFT的RTIME汇总到对应组,最终整理为目标格式。
步骤1:编写时间转换工具函数
先把"分:秒"格式转成总秒数方便计算,再转换回字符串格式:
def time_to_sec(time_str): if not time_str: return 0 mins, secs = map(int, time_str.split(':')) return mins * 60 + secs def sec_to_time(total_sec): if total_sec == 0: return '' mins = total_sec // 60 secs = total_sec % 60 return f"{mins}:{secs:02d}"
步骤2:分组处理数据
用字典存储分组信息,键为(FID, LEFT),值记录该组的累计时间和RIGHT字段信息:
a = [{'ID': 1, 'FID': 938119, 'LEFT': 'A', 'LTIME': '1:10', 'RIGHT': '', 'RTIME': ''}, {'ID': 2, 'FID': 938119, 'LEFT': 'B', 'LTIME': '1:55', 'RIGHT': '', 'RTIME': ''}, {'ID': 3, 'FID': 938119, 'LEFT': '', 'LTIME': '', 'RIGHT': 'A', 'RTIME': '1:20'}, {'ID': 4, 'FID': 938119, 'LEFT': 'A', 'LTIME': '1:56', 'RIGHT': '', 'RTIME': ''}, {'ID': 5, 'FID': 938120, 'LEFT': 'A', 'LTIME': '1:36', 'RIGHT': '', 'RTIME': ''}, ] groups = {} for item in a: fid = item['FID'] left = item['LEFT'] right = item['RIGHT'] # 处理LEFT非空的条目,归入(FID, LEFT)组 if left: key = (fid, left) if key not in groups: groups[key] = { 'FID': fid, 'LEFT': left, 'total_ltime': 0, 'total_rtime': 0, 'RIGHT': '' } groups[key]['total_ltime'] += time_to_sec(item['LTIME']) # 处理RIGHT非空的条目,归入(FID, RIGHT)组 if right: key = (fid, right) if key not in groups: groups[key] = { 'FID': fid, 'LEFT': right, 'total_ltime': 0, 'total_rtime': 0, 'RIGHT': right } groups[key]['total_rtime'] += time_to_sec(item['RTIME']) groups[key]['RIGHT'] = right
步骤3:整理为目标格式
将分组结果转换为要求的列表结构,重新分配ID:
b = [] for idx, group in enumerate(groups.values(), start=1): b.append({ 'ID': idx, 'FID': group['FID'], 'LEFT': group['LEFT'], 'LTIME': sec_to_time(group['total_ltime']), 'RIGHT': group['RIGHT'], 'RTIME': sec_to_time(group['total_rtime']) }) # 查看结果 import pprint pprint.pprint(b)
运行输出
[{'ID': 1, 'FID': 938119, 'LEFT': 'A', 'LTIME': '3:06', 'RIGHT': 'A', 'RTIME': '1:20'}, {'ID': 2, 'FID': 938119, 'LEFT': 'B', 'LTIME': '1:55', 'RIGHT': '', 'RTIME': ''}, {'ID': 3, 'FID': 938120, 'LEFT': 'A', 'LTIME': '1:36', 'RIGHT': '', 'RTIME': ''}]
内容的提问来源于stack exchange,提问作者happytimecq
相关产品推荐
相关产品推荐

