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

Python如何编写函数清洗聚合字典列表实现去重并统计数量

原有代码问题分析
  • 初始状态下cleanedBigData为空,内层for循环完全不会执行,没有任何数据会被添加到结果列表
  • 内层循环逻辑错误:每遇到一个不匹配的name就新增条目,会导致大量重复数据生成
  • 字典属性取值错误:应该用i["name"]而不是i.name,后者是类实例属性的取值方式,不适用于字典
  • 计数逻辑错误:匹配到相同name时,应该给结果列表里的对应条目u的quantity加1,而不是修改原数据i
实现方案

方案1:使用collections.Counter(最简洁)

适合绝大多数场景,代码量少、执行效率高:

from collections import Counter

def aggregate_data(big_data):
    # 统计所有name的出现次数
    name_count = Counter(item["name"] for item in big_data)
    # 转换为目标结构
    return [{"name": name, "quantity": count} for name, count in name_count.items()]

# 调用示例
cleanedBigData = aggregate_data(bigData)

方案2:手动实现聚合逻辑(无额外依赖,适合理解原理)

用辅助字典记录name对应结果列表的下标,避免双层循环,时间复杂度为O(n),数据量大时优势明显:

def aggregate_data(big_data):
    cleaned = []
    # 存储name对应结果列表中的索引,避免每次全量遍历结果列表
    name_index_map = {}
    for item in big_data:
        current_name = item["name"]
        if current_name in name_index_map:
            # 已存在同名条目,计数+1
            cleaned[name_index_map[current_name]]["quantity"] += 1
        else:
            # 不存在同名条目,新增并记录索引
            new_item = {"name": current_name, "quantity": 1}
            cleaned.append(new_item)
            name_index_map[current_name] = len(cleaned) - 1
    return cleaned

# 调用示例
cleanedBigData = aggregate_data(bigData)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:54:03