Python中如何对不可哈希的列表进行去重?
解决列表去重时的TypeError问题
出现TypeError: unhashable type: 'list'是因为set()要求元素必须是可哈希类型(比如字符串、元组),但你的列表a中的元素是子列表(如['JR06-C5-p21']),而列表属于不可哈希类型,无法直接存入集合去重。
以下是几种可行的解决方法:
方法1:将子列表转为元组去重(简单直接)
先把每个子列表转成可哈希的元组,用集合去重后再转回列表:
a = [['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20']] # 转元组去重 unique_tuples = list(set(tuple(item) for item in a)) # 转回列表格式 unique_list = [list(t) for t in unique_tuples] print(unique_list)
方法2:手动遍历保留顺序(维持原列表元素顺序)
如果需要保留原列表中元素首次出现的顺序,可用这种方法:
a = [['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20']] unique_list = [] seen = set() for item in a: # 将子列表转为元组存入集合记录已出现元素 item_tuple = tuple(item) if item_tuple not in seen: seen.add(item_tuple) unique_list.append(item) print(unique_list)
方法3:提取子列表元素去重(适用于子列表仅含单个元素的情况)
你的子列表都只有一个元素,可以先提取元素去重,再重新包装成子列表:
a = [['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR06-C5-p21'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20'], ['JR08-C2-p20']] # 提取子列表中的唯一元素去重 unique_elements = list(set(item[0] for item in a)) # 重新包装为子列表格式 unique_list = [[elem] for elem in unique_elements] print(unique_list)
内容的提问来源于stack exchange,提问作者Achal Neupane
相关产品推荐
相关产品推荐

