Python如何对列表字典按series去重并合并同系列id值
实现方案
这个需求完全可以实现,你之前写的代码有几个明显问题:
- 遍历对象写错了:循环写的
for entry in seriesdict,但seriesdict是你一开始定义的空结构字典,实际要遍历的是你存了所有书籍信息的原始排序列表 - 存在性判断逻辑不对:你直接查
entry['series'] not in sortedseriesdict['series'],但sortedseriesdict是单个临时字典,不是存了所有结果的列表,这个判断根本达不到“检查系列是否已经录入结果”的效果 - id处理逻辑错误:遇到同系列的条目时你直接覆盖了
ids字段的值,没有做追加,而且不管是不是新系列都往结果列表append,会生成大量重复的错误条目
最稳妥的实现方式是用临时字典做映射,不需要依赖提前排序,遍历一次就能完成聚合,时间复杂度O(n),效率很高,不会出逻辑问题:
# 这里替换成你实际存储原始书籍条目的排序列表变量名 raw_list = [ {'index': 237, 'series': '5 Centimeters per Second', 'id': '13050'}, {'index': 303, 'series': '86 EIGHTY-SIX', 'id': '9809'}, {'index': 304, 'series': '86 EIGHTY-SIX', 'id': '13540'}, {'index': 305, 'series': '86 EIGHTY-SIX', 'id': '9289'}, {'index': 306, 'series': '86 EIGHTY-SIX', 'id': '13323'}, {'index': 307, 'series': '86 EIGHTY-SIX', 'id': '10783'}, {'index': 309, 'series': '86 EIGHTY-SIX', 'id': '12084'}, {'index': 310, 'series': '86 EIGHTY-SIX', 'id': '10943'}, {'index': 311, 'series': '86 EIGHTY-SIX', 'id': '9202'}, {'index': 2329, 'series': 'A Certain Magical Index', 'id': '12843'} ] series_id_map = {} for item in raw_list: s_name = item['series'] s_id = item['id'] if s_name not in series_id_map: series_id_map[s_name] = [s_id] else: series_id_map[s_name].append(s_id) # 转换成你需要的最终结构 sorted_data = [] for s_name, id_list in series_id_map.items(): sorted_data.append({ 'series': s_name, 'ids': ', '.join(id_list) })
如果你已经把原始列表按series字段排好序,也可以不用临时字典,直接遍历列表聚合,内存占用更低:
sorted_data = [] current_series = None for item in raw_list: s_name = item['series'] s_id = item['id'] if s_name != current_series: # 碰到新系列,直接新增条目 sorted_data.append({ 'series': s_name, '_tmp_ids': [s_id] }) current_series = s_name else: # 同系列,往最后一个条目的id列表追加值 sorted_data[-1]['_tmp_ids'].append(s_id) # 最后统一把id列表拼成逗号分隔的字符串,删掉临时字段 for res_item in sorted_data: res_item['ids'] = ', '.join(res_item.pop('_tmp_ids'))
用你提供的示例数据跑上面的代码,得到的结果和你预期的结构完全一致:
[ {'series': '5 Centimeters per Second', 'ids': '13050'}, {'series': '86 EIGHTY-SIX', 'ids': '9809, 13540, 9289, 13323, 10783, 12084, 10943, 9202'}, {'series': 'A Certain Magical Index', 'ids': '12843'} ]
你问题描述里写的预期结果存在笔误:5 Centimeters per Second对应的id是13050,9809是86 EIGHTY-SIX的第一个id,代码会按原始数据的顺序正确收集所有关联id。
内容的提问来源于stack exchange,提问作者WorldTeacher
相关产品推荐
相关产品推荐

