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

