如何从含嵌套列表的混合列表中去除重复元素?
混合嵌套列表的元素去重方法
直接用set()处理包含嵌套列表的混合列表会报错,因为列表是不可哈希类型,无法存入集合。要实现对这类列表的元素去重,需要针对性处理不可哈希元素,以下是两种实用方案:
方案1:递归处理所有层级的嵌套列表
如果需要对所有层级的列表元素都去重(包括嵌套列表内部的元素),可以用递归方法:
def unique_elements(lst): processed = [] seen = set() for item in lst: if isinstance(item, list): # 先递归处理嵌套列表的内部元素 nested_unique = unique_elements(item) # 将嵌套列表转为可哈希的元组,用于判断重复 item_tuple = tuple(nested_unique) if item_tuple not in seen: seen.add(item_tuple) processed.append(nested_unique) else: # 普通可哈希元素直接判断重复 if item not in seen: seen.add(item) processed.append(item) return processed
示例测试
假设你的目标列表是:
test_list = [ ['1', '1'], ['2', '2'], ['3', '3', '4', '5', '6'], ['7', '8', ['7', '7'], '1', ['7']], [['7'], ['8', '8'], ['7'], ['7']], ['2', '2'] ]
调用函数后输出结果:
[ ['1'], ['2'], ['3', '4', '5', '6'], ['7', '8', ['7'], '1'], [['7'], ['8']], ['2'] ]
方案2:仅处理顶层子列表的元素
如果只需要对每个顶层子列表的元素去重(不处理嵌套列表内部的元素),用非递归方法更高效:
def unique_sublist_elements(lst): result = [] for sublist in lst: unique_items = [] seen = set() for item in sublist: if isinstance(item, list): # 嵌套列表转元组判断是否重复 item_key = tuple(item) if item_key not in seen: seen.add(item_key) unique_items.append(item) else: if item not in seen: seen.add(item) unique_items.append(item) result.append(unique_items) return result
关键说明
- 两种方案都通过将嵌套列表转为元组(可哈希类型)解决了不可哈希元素的去重问题
- 遍历过程中会保留元素的原始顺序(Python 3.7+ 特性,若用旧版本可改用
collections.OrderedDict) - 递归方案适合深度嵌套的列表结构,非递归方案更适合仅需处理顶层子列表的场景
内容的提问来源于stack exchange,提问作者ola
相关产品推荐
相关产品推荐

