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

Python字典列表按f_id去重合并record_id并解决JSON序列化问题

Python 字典列表按指定键去重合并解决方案

问题原因

  • 报错核心原因:JSON 标准不支持 Python 独有的 set 类型,序列化时无法识别该数据结构
  • 原有代码额外问题:使用 {*l[0]} 对字典拆包时仅会提取字典的键,会丢失所有键对应的值,正确的字典拆包语法为 **l[0]

解决方案

易维护的遍历写法(推荐)

可读性高,方便后续调整逻辑:

from itertools import groupby

list_of_dict = [
    {'f_text':'sample', 'symbol':'*', 'f_id':246, 'record_id':'4679', 'flag': 'N'},
    {'f_text':'sample', 'symbol':'*', 'f_id':246, 'record_id':'4680', 'flag': 'N'},
    {'f_text':'other text', 'symbol':'!#', 'f_id':247, 'record_id':'4678', 'flag': 'N'}
]

# groupby要求同组元素连续,先按f_id排序
sorted_list = sorted(list_of_dict, key=lambda x: x["f_id"])
result = []

for f_id, group in groupby(sorted_list, key=lambda x: x["f_id"]):
    group_items = list(group)
    # 取同组第一个条目作为公共字段模板
    merged_item = group_items[0].copy()
    # 收集当前组所有record_id,如需数字类型可加int()转换
    record_ids = [item["record_id"] for item in group_items]
    # 单条保留字符串,多条存列表,符合预期输出格式
    merged_item["record_id"] = record_ids if len(record_ids) > 1 else record_ids[0]
    result.append(merged_item)

# 直接返回即可,无序列化问题
# return jsonify(result)

修正后的推导式写法

如果你偏好短代码,可以使用调整后的推导式:

from itertools import groupby

result = [
    {**l[0], "record_id": [x["record_id"] for x in l]} 
    if len(l:=list(v)) > 1 
    else l[0] 
    for _, v in groupby(sorted(list_of_dict, key=lambda x: x["f_id"]), key=lambda x: x["f_id"])
]

输出验证

最终输出和要求的格式完全一致:

[
    {'f_text':'sample', 'symbol':'*', 'f_id':246, 'record_id':['4679','4680'], 'flag': 'N'},
    {'f_text':'other text', 'symbol':'!#', 'f_id':247, 'record_id':'4678', 'flag': 'N'}
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:48:04