Python如何从嵌套列表中移除完全相同的重复子列表?
嵌套列表去重实现指南
现有代码的核心问题
- 代码已经完成了列表拼接、子列表转可哈希元组的前置步骤,但遗漏了关键赋值环节:仅通过
print(set(a))打印了去重结果,没有将去重后的集合重新赋值回变量a。 - 此时变量
a仍为拼接后包含重复元素的原始列表(总长度7,其中[1,2,3]、[0,1,2]各重复出现1次),因此后续统计的长度、输出的列表内容,都不是去重后的预期结果。
实现方案
快速修正原有代码
Python中列表属于不可哈希类型,无法直接放入集合去重,需要先转换为可哈希的元组完成去重,再转回列表格式即可:
a1 = [[1,2,3],[2,3,4]] a2 = [[0,1,2],[2,4,6]] a3 = [[1,2,3],[0,1,2],[3,6,9]] # 拼接初始列表 a = a1 + a2 + a3 # 核心修正:将元组序列去重后重新赋值回a a = list(set([tuple(l) for l in a])) # 元组转回嵌套列表格式 a = [list(ele) for ele in a] print(a) print(len(a))
注意:Python 3.7及以上版本的集合会保留元素首次出现的顺序,最终输出的列表顺序和目标结果完全一致。
全版本兼容的保序去重写法
如果需要在所有Python版本下严格保证元素顺序和首次出现时一致,不依赖集合的顺序特性,可以通过遍历+已见元素记录的方式实现:
a1 = [[1,2,3],[2,3,4]] a2 = [[0,1,2],[2,4,6]] a3 = [[1,2,3],[0,1,2],[3,6,9]] seen = set() a = [] # 遍历所有拼接后的子列表 for sublist in a1 + a2 + a3: # 转成元组作为可哈希的比对标识 key = tuple(sublist) if key not in seen: seen.add(key) a.append(list(key)) print(a) print(len(a))
两种方案执行后,最终得到的列表a长度为5,内容和目标结果[[1,2,3],[2,3,4], [0,1,2],[2,4,6],[3,6,9]]完全匹配。
内容的提问来源于stack exchange,提问作者suhyeon
相关产品推荐
相关产品推荐

