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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:33:15