Python实现基于BeginOffset和EndOffset的JSON对象合并
Python实现按BeginOffset和EndOffset合并重复JSON对象
实现思路
- 分组:以
(BeginOffset, EndOffset)作为唯一标识,把所有JSON对象按这个标识分组,相同偏移量的对象归为一组。 - 合并处理:
- 每组的基础数据保留第一个对象的
Text、Id、BeginOffset、EndOffset字段 - 遍历组内每个对象,对
Score、Category、Type这三个字段:- 如果组内只有一个对象,直接保留原字段名
- 如果组内有多个对象,给字段名加上序号(如
Score-1、Score-2)
- 每组的基础数据保留第一个对象的
- 结果转换:把处理后的分组对象整理成列表输出
完整代码实现
from collections import defaultdict def merge_duplicate_objects(data): # 按(BeginOffset, EndOffset)分组 offset_groups = defaultdict(list) for obj in data: key = (obj['BeginOffset'], obj['EndOffset']) offset_groups[key].append(obj) merged_data = [] # 处理每个分组 for group in offset_groups.values(): # 初始化合并后的对象,取第一个对象的基础字段 merged_obj = { 'Text': group[0]['Text'], 'Id': group[0]['Id'], 'BeginOffset': group[0]['BeginOffset'], 'EndOffset': group[0]['EndOffset'] } # 处理需要重命名的字段 fields_to_rename = ['Score', 'Category', 'Type'] for idx, obj in enumerate(group, start=1): for field in fields_to_rename: if len(group) == 1: merged_obj[field] = obj[field] else: merged_obj[f"{field}-{idx}"] = obj[field] merged_data.append(merged_obj) return merged_data # 测试输入数据 data = [ { "Text": "First", "Id": 1, "BeginOffset": 60, "EndOffset": 73, "Score": 0.5620501637458801, "Category": "Testing", "Type": "Name", }, { "Text": "Second", "Id": 5, "BeginOffset": 60, "EndOffset": 73, "Score": 0.959932804107666, "Category": "Testing 2", "Type": "Name 2" }, { "Text": "Third", "Id": 2, "BeginOffset": 85, "EndOffset": 94, "Score": 0.9013960361480713, "Category": "Testing 3", "Type": "Value" } ] # 执行合并并打印结果 result = merge_duplicate_objects(data) import json print(json.dumps(result, indent=2))
代码解释
- 分组逻辑:用
collections.defaultdict创建分组字典,键是偏移量元组,确保相同偏移的对象被放在一起。 - 基础字段保留:每个合并后的对象以组内第一个对象的
Text、Id和偏移量作为基础,符合示例中保留第一个对象基础信息的要求。 - 字段重命名:通过
enumerate给组内对象编号,对需要重命名的字段,根据组内对象数量决定是保留原字段名还是添加序号。 - 结果格式化:最后用
json.dumps格式化输出,和示例的结构一致。
输出结果
运行代码后会得到和示例一致的合并结果:
[ { "Text": "First", "Id": 1, "BeginOffset": 60, "EndOffset": 73, "Score-1": 0.5620501637458801, "Category-1": "Testing", "Type-1": "Name", "Score-2": 0.959932804107666, "Category-2": "Testing 2", "Type-2": "Name 2" }, { "Text": "Third", "Id": 2, "BeginOffset": 85, "EndOffset": 94, "Score": 0.9013960361480713, "Category": "Testing 3", "Type": "Value" } ]
内容的提问来源于stack exchange,提问作者iamhimanshu0
相关产品推荐
相关产品推荐

