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
相关产品推荐
相关产品推荐

