如何获取Python列表中的唯一嵌套列表?解决不可哈希类型错误
解决嵌套列表去重的TypeError问题
你遇到的TypeError: unhashable type: 'list'是因为集合(set)要求元素必须是可哈希类型,而列表(list)是不可哈希的。你之前的代码只把外层子列表转成了tuple,但子列表内部的元素(比如[14]、['walk'])还是列表,依然不可哈希,所以无法存入集合。
要解决这个问题,需要把嵌套结构里的所有列表都转换成可哈希的类型(比如tuple),去重后再转换回列表。这里提供两种方法:
方法1:递归转换(通用任意嵌套深度)
写两个递归函数,分别负责把嵌套列表转成可哈希的tuple结构,以及把tuple转回列表:
def to_hashable(item): if isinstance(item, list): return tuple(to_hashable(i) for i in item) return item def from_hashable(item): if isinstance(item, tuple): return list(from_hashable(i) for i in item) return item # 你的原始列表 lst = [ [[14], ['walk'], [69], ['walk'], [7]], [[14], ['walk'], [69], ['walk'], [7]], [[30], [948], [75], [947], [10]], [[14]] ] # 转换为可哈希结构并去重 hashable_items = [to_hashable(sub) for sub in lst] unique_hashable = set(hashable_items) # 转回列表结构 unique_data = [from_hashable(item) for item in unique_hashable] print(unique_data)
方法2:手动转换(固定两层嵌套)
如果你的列表嵌套深度固定为两层(外层列表→子列表→内层列表),可以直接手动转换两层结构,不用递归:
lst = [ [[14], ['walk'], [69], ['walk'], [7]], [[14], ['walk'], [69], ['walk'], [7]], [[30], [948], [75], [947], [10]], [[14]] ] # 把所有内层列表转成tuple,外层子列表也转成tuple hashable_lst = [tuple(tuple(i) for i in sub) for sub in lst] # 去重 unique_hashable = set(hashable_lst) # 转回列表结构 unique_data = [list(list(i) for i in item) for item in unique_hashable] print(unique_data)
两种方法最终都会得到你期望的输出:
[[[14], ['walk'], [69], ['walk'], [7]], [[30], [948], [75], [947], [10]], [[14]]]
内容的提问来源于stack exchange,提问作者ask_10
相关产品推荐
相关产品推荐

