如何从Python的列表嵌套列表中去除重复子列表?
如何高效去除嵌套列表中的重复子列表
问题背景
我是Python新手,需要处理嵌套列表的去重需求。示例如下:
输入:
List = [[1, 'A', 6, 2], [8, 'C', 6, 2], [3, 'G', 3, 4], [1, 'A', 6, 2], [3, 'G', 3, 4], [3, 'B', 3, 4]]
期望输出:
[[1, 'A', 6, 2], [8, 'C', 6, 2], [3, 'G', 3, 4], [3, 'B', 3, 4]]
原本用以下for循环实现,但数据量大时速度极慢:
unique = [] for i in cohesiveFaceNodes: if not i in unique: unique.append(i) cohesiveFaceNodes = unique
高效解决方案
方案1:集合+元组(最快,不保证顺序)
列表是不可哈希类型,无法直接存入集合,先把每个子列表转成可哈希的元组,去重后再转回列表:
# 转元组去重,再转回列表 unique_tuples = set(tuple(sublist) for sublist in cohesiveFaceNodes) unique_list = [list(t) for t in unique_tuples]
提示:集合是无序的,所以最终结果会打乱原列表的顺序。如果不需要保留顺序,这是性能最优的方案——集合的成员判断是O(1)时间复杂度,远快于列表的O(n)。
方案2:利用Python 3.7+字典的有序性(保留原顺序)
Python 3.7及以上版本的字典会保留插入顺序,用元组作为键实现去重,最后提取键转回列表:
# 有序去重,保留子列表首次出现的顺序 unique_dict = {tuple(sublist): None for sublist in cohesiveFaceNodes} unique_list = [list(t) for t in unique_dict.keys()]
这个方案的时间复杂度是O(n),比原方法的O(n²)效率提升巨大,同时能维持原列表的顺序。
方案3:dict.fromkeys简洁实现(保留顺序)
用dict.fromkeys可以更简洁地完成和方案2一样的效果:
unique_list = [list(t) for t in dict.fromkeys(tuple(sublist) for sublist in cohesiveFaceNodes)]
原方法慢的原因
原循环中,每次执行if not i in unique都要遍历整个unique列表,时间复杂度是O(n²)——比如列表有1000个元素,就要执行1000*1000=100万次操作;如果是1万个元素,就是1亿次,数据量越大越慢。而上面的方案用集合或字典,查找操作都是O(1),整体仅需O(n)时间,效率提升非常明显。
内容的提问来源于stack exchange,提问作者idontunderstand
相关产品推荐
相关产品推荐

