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

如何按相同id合并Python字典列表并获取最新创建时间?

问题

我有如下结构的Python字典列表:

[
{'id': 'A123',
  'feature': {'name': 'jack', 'age' : '18' },
  'create_time': '2022-5-17 10:29:47',
  'is_fast': False},
  
 {'id': 'A123',
  'feature': {'gender': 'male'},
  'create_time': '2022-5-17 10:29:47',
  'is_fast': False},
  
{'id': 'A123',
  'habit': {'name': 'read'},
  'create_time': '2022-5-15 10:29:45',
  'is_fast': False},

{'id': 'A456',
  'feature': {'name': 'rose'},
  'create_time': '2022-4-15 10:29:45',
  'is_fast': False},
  
  {'id': 'A456',
  'habit': {'name': 'sport'},
  'create_time': '2022-3-15 10:29:45',
  'is_fast': False}
]

希望通过函数将相同id的字典合并,合并规则如下:

  • 嵌套字典(如feature、habit)需要整合所有键值对
  • create_time取对应id下的最新时间
  • 其他字段(如is_fast)保持一致(假设同id下这些字段值相同)

目标输出如下(注:目标输出中A123的create_time应为原始数据里的最新时间2022-5-17 10:29:47,示例中的2022-5-19应为笔误):

[
{'id': 'A123',
  'feature': {'name': 'jack', 'age' : '18' ,'gender': 'male'},
  'habit': {'name': 'read'},
  'create_time': '2022-5-17 10:29:47',
  'is_fast': False},

{'id': 'A456',
  'feature': {'name': 'rose'},
  'habit': {'name': 'sport'},
  'create_time': '2022-4-15 10:29:45',
  'is_fast': False},
]

请问该如何实现这一合并操作?

解决方案

可以通过以下步骤实现合并:

  1. 用临时字典按id分组存储数据,键为id,值为对应合并后的字典
  2. 遍历原始列表,对每个字典按规则合并到对应id的条目里:
    • 嵌套字典通过update方法整合所有键值对
    • 转换时间字符串为datetime对象,比较后保留最新的create_time
    • 非嵌套、非时间字段直接赋值(假设同id下值一致)

具体代码实现:

from datetime import datetime
import pprint

def merge_dicts_by_id(data_list):
    merged_dict = {}
    for item in data_list:
        item_id = item["id"]
        # 初始化当前id的合并条目
        if item_id not in merged_dict:
            merged_dict[item_id] = {"id": item_id}
        
        current_entry = merged_dict[item_id]
        for key, value in item.items():
            if key == "id":
                continue
            # 处理嵌套字典
            elif isinstance(value, dict):
                if key not in current_entry:
                    current_entry[key] = {}
                current_entry[key].update(value)
            # 处理时间字段,保留最新值
            elif key == "create_time":
                current_dt = datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
                if "create_time" not in current_entry:
                    current_entry["create_time"] = value
                else:
                    existing_dt = datetime.strptime(current_entry["create_time"], "%Y-%m-%d %H:%M:%S")
                    if current_dt > existing_dt:
                        current_entry["create_time"] = value
            # 处理其他字段
            else:
                current_entry[key] = value
    # 将字典值转换为列表返回
    return list(merged_dict.values())

# 测试执行
original_data = [
    {'id': 'A123', 'feature': {'name': 'jack', 'age': '18'}, 'create_time': '2022-5-17 10:29:47', 'is_fast': False},
    {'id': 'A123', 'feature': {'gender': 'male'}, 'create_time': '2022-5-17 10:29:47', 'is_fast': False},
    {'id': 'A123', 'habit': {'name': 'read'}, 'create_time': '2022-5-15 10:29:45', 'is_fast': False},
    {'id': 'A456', 'feature': {'name': 'rose'}, 'create_time': '2022-4-15 10:29:45', 'is_fast': False},
    {'id': 'A456', 'habit': {'name': 'sport'}, 'create_time': '2022-3-15 10:29:45', 'is_fast': False}
]

result = merge_dicts_by_id(original_data)
pprint.pprint(result)

代码说明

  • 使用datetime.strptime将时间字符串转为可比较的对象,确保正确识别最新时间
  • 嵌套字典通过update方法实现键值对整合,后续的嵌套数据不会覆盖已有键,只会补充新键或更新重复键的值
  • 临时字典merged_dict负责按id分组,最后转换为列表得到最终合并结果

内容的提问来源于stack exchange,提问作者rookie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:18:19