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

Python实现基于BeginOffset和EndOffset的JSON对象合并

Python实现按BeginOffset和EndOffset合并重复JSON对象

实现思路

  1. 分组:以(BeginOffset, EndOffset)作为唯一标识,把所有JSON对象按这个标识分组,相同偏移量的对象归为一组。
  2. 合并处理:
    • 每组的基础数据保留第一个对象的Text、Id、BeginOffset、EndOffset字段
    • 遍历组内每个对象,对Score、Category、Type这三个字段:
      • 如果组内只有一个对象,直接保留原字段名
      • 如果组内有多个对象,给字段名加上序号(如Score-1、Score-2)
  3. 结果转换:把处理后的分组对象整理成列表输出

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:01:55