百万级字典数组去重:现有方法耗时过长,求最优解决方案
百万级对象列表高效去重方案
你的原去重方法耗时极长的核心原因是时间复杂度为O(n²):每次执行output[i] not in output[i + 1:]时,都要遍历剩余所有元素,百万级数据下这种嵌套遍历会让计算量指数级增长。
下面是两种高效优化方案,时间复杂度均为O(n),处理百万级数据仅需几秒到几十秒:
方案一:基于唯一标识(如id)去重
如果业务场景中id是唯一标识(这也是最常见的情况),直接用集合记录已出现的id即可:
seen_ids = set() clean_list = [] for item in output: item_id = item['id'] if item_id not in seen_ids: seen_ids.add(item_id) clean_list.append(item)
这种方法效率最高,因为集合的查询和插入操作平均时间复杂度都是O(1),遍历一次列表就能完成去重。
方案二:基于整个字典内容去重
如果需要完全根据字典的所有键值对去重(比如存在id相同但name不同,或无唯一标识的场景),可以将字典转换为可哈希的元组(排序键值对确保相同内容生成相同元组):
seen = set() clean_list = [] for item in output: # 排序键值对避免因键的顺序不同导致元组不一致 unique_key = tuple(sorted(item.items())) if unique_key not in seen: seen.add(unique_key) clean_list.append(item)
拓展:保留重复元素的最后一次出现
如果需要保留重复元素中最后出现的那个,可以反向遍历后再反转结果:
seen_ids = set() clean_list = [] for item in reversed(output): item_id = item['id'] if item_id not in seen_ids: seen_ids.add(item_id) clean_list.append(item) # 反转回原顺序 clean_list = clean_list[::-1]
内容的提问来源于stack exchange,提问作者newbieprogrammer095
相关产品推荐
相关产品推荐

