Python中如何合并值相近的字典?按name字段合并point列表示例
实现方案
利用Python3.6版本字典默认保留插入顺序的特性,直接用内置字典做分组存储即可实现需求,无需引入第三方依赖,具体实现如下:
from uuid import uuid1 # 模拟输入数据 Input = [ {'id': uuid1(), 'name': 'mem', 'point': [{'second': 0, 'severity': 'infor'}], 'date': '2021-09-15', 'PO': 5}, {'id': uuid1(), 'name': 'cpu', 'point': [{'second': 10, 'severity': 'warning'}], 'date': '2021-09-13', 'PO': 3}, {'id': uuid1(), 'name': 'cpu', 'point': [{'second': 20, 'severity': 'critical'}], 'date': '2021-09-14', 'PO': 3}, {'id': uuid1(), 'name': 'cpu', 'point': [{'second': 30, 'severity': 'infor'}], 'date': '2021-09-15', 'PO': 3} ] def merge_data(input_list): group = {} for item in input_list: name = item['name'] if name not in group: # 首次出现时初始化分组 group[name] = item.copy() group[name]['point'] = group[name]['point'].copy() else: # 拼接point列表 group[name]['point'].extend(item['point']) # 覆盖非point字段,自动保留最后一次的取值 for k, v in item.items(): if k != 'point': group[name][k] = v return list(group.values()) Output = merge_data(Input) # 可直接打印验证输出结果 print(Output)
补充说明
- 代码完全匹配要求的合并规则:同
name分组下的point列表会按遍历顺序拼接,其余字段自动取分组最后一条记录的取值 - 已做基础的引用隔离,修改合并后的数据不会影响原始输入。如果需要完全深度隔离,可引入
copy模块,把上述copy()操作替换为copy.deepcopy()即可。
内容的提问来源于stack exchange,提问作者Tai Do
相关产品推荐
相关产品推荐

