如何在Python中去除嵌套列表中顺序任意的重复子列表
解决顺序无关的嵌套列表去重问题
这个需求挺常见的,核心思路就是给每个子列表生成一个不随元素顺序变化的唯一标识,然后利用集合自动去重的特性来处理。用Python实现的话,步骤非常清晰:
实现思路
因为列表是可变类型不能直接放进集合,所以我们可以把每个子列表排序后转换成元组(元组是不可变的,可以哈希)——不管元素顺序怎么变,排序后的元组都是一样的,这样就能把顺序不同但元素相同的子列表归为一类。
代码示例
# 你的原始嵌套列表 original_list = [ ["hello", "bye", "start"], ["bye", "start", "hello"], ["john", "riya", "tom"], ["riya", "john", "tom"] ] # 用集合存储排序后的元组,自动去重 unique_tuples = {tuple(sorted(sublist)) for sublist in original_list} # 把元组转回列表,得到最终结果 unique_lists = [list(item) for item in unique_tuples] print(unique_lists) # 输出: [['bye', 'hello', 'start'], ['john', 'riya', 'tom']]
补充说明
- 如果你在意最终子列表的元素顺序和原列表中第一次出现的一致,可以稍微调整写法,用一个集合记录已经处理过的标识,同时遍历原列表收集结果:
seen = set() unique_lists = [] for sublist in original_list: key = tuple(sorted(sublist)) if key not in seen: seen.add(key) unique_lists.append(sublist) print(unique_lists) # 输出: [['hello', 'bye', 'start'], ['john', 'riya', 'tom']]
这种写法会保留原列表中第一次出现的子列表的元素顺序,而不是排序后的顺序。
- 这个方法也适用于子列表长度不同的情况,因为长度不同的子列表排序后的元组长度不一样,集合不会把它们判定为重复。
内容的提问来源于stack exchange,提问作者Aisha
相关产品推荐
相关产品推荐

