Python含字典元素列表去重抛unhashable type异常解决方法
报错原因
你使用的list(dict.fromkeys(my_list))去重方案,依赖字典键的唯一性实现去重,要求序列元素必须是可哈希类型。你的列表元素是包含字典的元组,字典属于可变类型,天生不支持哈希,因此运行时会抛出unhashable type: 'dict'异常。
修复方案
手动遍历列表,为每个元素生成可哈希的唯一标识,记录已出现的标识,遇到重复项直接跳过即可,完全符合「元素100%相同即判定为重复」的规则。
针对当前固定结构的轻量实现
不需要引入额外依赖,直接把嵌套字典转为可哈希的元组作为判重依据:
my_list = [('admin', '', {'type': 'telnet'}), ('admin', '', {'type': 'telnet'})] seen = set() deduplicated_list = [] for item in my_list: # 将嵌套字典转为排序后的键值对元组,生成可哈希的唯一判重键 unique_key = ( item[0], item[1], tuple(sorted(item[2].items())) ) if unique_key not in seen: seen.add(unique_key) deduplicated_list.append(item) my_list = deduplicated_list
运行后示例列表会正确去重,最终值为[('admin', '', {'type': 'telnet'})]。
适配复杂嵌套结构的通用实现
如果你的元组后续可能出现更复杂的嵌套结构(比如多层字典、嵌套列表),可以用JSON序列化生成判重键,不需要手动处理类型转换:
import json my_list = [('admin', '', {'type': 'telnet'}), ('admin', '', {'type': 'telnet'})] seen = set() deduplicated_list = [] for item in my_list: # sort_keys=True 保证键顺序不同但内容一致的字典会被判定为重复 unique_key = json.dumps(item, sort_keys=True, ensure_ascii=False) if unique_key not in seen: seen.add(unique_key) deduplicated_list.append(item) my_list = deduplicated_list
注意:JSON序列化方案仅适用于元素可被JSON序列化的场景,如果包含自定义类实例等无法序列化的对象,还是需要手动转换结构生成判重键。
内容的提问来源于stack exchange,提问作者Roi
相关产品推荐
相关产品推荐

