Python处理大嵌套列表时如何快速去重最内层元素
为什么你的方法慢
问题根本出在用来记录见过的元素的seen是个普通列表:每次判断某个元素有没有出现过,都得把整个seen从头扫一遍比对。元素少的时候没感觉,一旦列表规模上来,这种逐行遍历的累计耗时会涨得特别快,自然就卡了。
顺带提一句你原代码里的小bug:函数定义的参数是seq,但实际扁平化的时候硬编码遍历了全局变量t,传其他列表进去是不会生效的。
快几十倍的改法
只要把存已见元素的结构换成哈希集合就行——集合的查找、插入操作都是常数级耗时,和元素总量没关系,整体直接变成线性的处理速度,性能是数量级的提升。
有个小细节要注意:集合只能存可哈希的对象,你最内层的元素是列表,没法直接塞集合里,只要把列表转成同内容的元组当判重的键就好,完全不影响比对结果。
给你个和你原逻辑完全一致(保留第一次出现的顺序、不改动原列表结构)的实现:
def get_unique_list(seq): seen = set() res = [] for sublist in seq: for item in sublist: # 转成元组做判重的key key = tuple(item) if key not in seen: seen.add(key) res.append(item) return res
效果说明
- 哪怕是十万、百万级的元素量,也就几百毫秒的事,不会像原方法那样卡半天
- 判重规则和你原来的写法完全一样:只有整个最内层列表所有元素都完全相同,才会被当成重复项去掉
- 返回的结构和你输入的嵌套列表格式完全一致,不会因为判重把列表转成元组改了格式
如果不需要严格保留元素的出现顺序,还能再压两行走集合去重,但大部分场景下列表顺序是有意义的,上面的写法已经是兼顾性能和可用性的最优解了。
内容的提问来源于stack exchange,提问作者ManInMoon
相关产品推荐
相关产品推荐

