如何在Python中移除嵌套列表中的重复元素
移除Python嵌套列表中的重复元素
嘿,这个问题我之前踩过坑!因为列表是可变对象,没办法直接作为set的元素去重——毕竟set只接受可哈希的类型嘛。不过有好几种高效又简单的办法,我给你分享几个常用的:
方法1:转元组用Set去重(简单但打乱顺序)
把每个子列表转成不可变的元组,就能放进set里去重了,最后再转回列表就行:
mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]] unique_list = [list(item) for item in set(tuple(sublist) for sublist in mylist)] print(unique_list)
⚠️ 注意:这个方法会打乱原列表的顺序,因为set是无序的。如果需要保留原始顺序,看下面的方法。
方法2:利用字典插入有序特性(保持顺序,高效)
从Python3.7开始,字典会记住键的插入顺序,我们可以用元组作为字典的键来实现去重,同时保留原始顺序:
mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]] # 用dict.fromkeys自动去重,键是元组,最后转回列表 unique_list = [list(key) for key in dict.fromkeys(tuple(sublist) for sublist in mylist)] print(unique_list)
这个方法时间复杂度是O(n),效率很高,还能完美保留原列表中元素第一次出现的顺序。
方法3:用Pandas处理(适合大数据量)
如果你的列表数据量很大,或者经常需要处理这类结构化数据,用Pandas会更方便,而且同样能保留顺序:
import pandas as pd mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]] # 转成DataFrame,去重后再转回列表 df = pd.DataFrame(mylist) unique_df = df.drop_duplicates() unique_list = unique_df.values.tolist() print(unique_list)
Pandas内部做了优化,处理大规模数据时比纯Python循环快很多。
方法4:手动遍历去重(逻辑清晰,适合自定义)
如果需要自定义去重逻辑,或者想手动控制过程,可以用一个集合记录已经见过的元素:
mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]] unique_list = [] seen = set() for sublist in mylist: tuple_sub = tuple(sublist) if tuple_sub not in seen: seen.add(tuple_sub) unique_list.append(sublist) print(unique_list)
这个方法也能保留原始顺序,逻辑直观,适合新手理解和修改。
内容的提问来源于stack exchange,提问作者J Cena
相关产品推荐
相关产品推荐

