如何按相同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}, ]
请问该如何实现这一合并操作?
解决方案
可以通过以下步骤实现合并:
- 用临时字典按
id分组存储数据,键为id,值为对应合并后的字典 - 遍历原始列表,对每个字典按规则合并到对应
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
相关产品推荐
相关产品推荐

