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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:24:08