基于item与introduced_at标识,用Pythonic方式合并列表字典
Pythonic实现字典列表合并方案
问题描述
给定字典列表,其中item与introduced_at的组合为唯一标识,需合并相同标识的字典条目:
original_data = [ { "introduced_at": "28.12.2000", "item": "Pizza", "item_price": [ { "date": "01.01.2011", "details": [ {"price": 1000, "changed_by": "Dieter"}, {"price": 900, "changed_by": "Nina"}, ], } ], }, { "introduced_at": "28.12.2000", "item": "Pizza", "item_price": [ { "date": "01.01.2012", "details": [ {"price": 1050, "changed_by": "Dieter"}, {"price": 900, "changed_by": "Nina"}, ], } ], }, ]
合并规则
item_price中不同date的条目需单独保留details中需剔除重复项(以changed_by为唯一标识,保留首次出现的价格记录)
预期结果
{ "price_dev": [ { "introduced_at": "28.12.2000", "item": "Pizza", "item_price": [ { "date": "01.01.2011", "details": [ {"price": 1000, "changed_by": "Dieter"}, {"price": 900, "changed_by": "Nina"}, ], }, { "date": "01.01.2012", "details": [ {"price": 1050, "changed_by": "Dieter"} ], }, ], } ] }
Pythonic实现代码
def merge_price_data(data): # 用元组作为键分组,确保相同标识的条目归为一组 grouped = {} for entry in data: key = (entry["introduced_at"], entry["item"]) if key not in grouped: # 初始化分组的基础结构 grouped[key] = { "introduced_at": entry["introduced_at"], "item": entry["item"], "item_price": [] } # 处理当前条目中的价格记录 for price_entry in entry["item_price"]: # 对details去重:保留每个changed_by的首次记录 seen_users = set() unique_details = [] for detail in price_entry["details"]: if detail["changed_by"] not in seen_users: seen_users.add(detail["changed_by"]) unique_details.append(detail) # 检查当前date是否已存在于分组中 existing_date_entry = next( (p for p in grouped[key]["item_price"] if p["date"] == price_entry["date"]), None ) if existing_date_entry: # 合并details,避免重复添加同一用户的记录 existing_users = set(d["changed_by"] for d in existing_date_entry["details"]) for d in unique_details: if d["changed_by"] not in existing_users: existing_users.add(d["changed_by"]) existing_date_entry["details"].append(d) else: # 新增date条目,使用去重后的details grouped[key]["item_price"].append({ "date": price_entry["date"], "details": unique_details }) # 转换为要求的输出格式 return {"price_dev": list(grouped.values())} # 测试执行 original_data = [ { "introduced_at": "28.12.2000", "item": "Pizza", "item_price": [ { "date": "01.01.2011", "details": [ {"price": 1000, "changed_by": "Dieter"}, {"price": 900, "changed_by": "Nina"}, ], } ], }, { "introduced_at": "28.12.2000", "item": "Pizza", "item_price": [ { "date": "01.01.2012", "details": [ {"price": 1050, "changed_by": "Dieter"}, {"price": 900, "changed_by": "Nina"}, ], } ], }, ] # 打印格式化结果 import json print(json.dumps(merge_price_data(original_data), indent=4))
实现思路说明
- 分组逻辑:使用元组
(introduced_at, item)作为字典的键,利用字典的键唯一性自动完成相同标识条目的分组,这是Python中处理分组场景的惯用手法,简洁且高效。 - Details去重:通过
set记录已出现的changed_by值,遍历details列表时仅保留首次出现的条目,快速实现去重。 - Price条目合并:对每个
date的价格记录,先检查是否已存在于分组中,存在则合并去重后的details,不存在则直接添加新的date条目,确保不同日期的记录独立保留。
内容的提问来源于stack exchange,提问作者Blob
相关产品推荐
相关产品推荐

