Python创建由列表组成的集合时报TypeError: unhashable type: 'list'如何处理
报错触发原因
Python 集合基于哈希表实现,要求所有元素必须是*可哈希(hashable)*的类型:即对象在生命周期内拥有固定不变的哈希值,才能被哈希表定位存储。
而列表是可变类型,支持对内部元素进行增删改操作,无法保证哈希值固定,因此Python没有为列表实现哈希方法,直接将列表存入集合时就会触发TypeError: unhashable type: 'list'报错。
存储序列类型元素的集合实现方案
- 方案1:将列表转为元组存入集合(最常用)
元组是不可变序列,属于可哈希类型,如果你不需要修改存入的序列内容,这是成本最低的实现方式,示例代码如下:
# 先将所有列表转为元组再创建集合 color_set = {tuple(['red', 'green', 'blue']), tuple(['white', 'yellow', 'gray']), tuple(['purple', 'pink', 'lilac'])} print(color_set) # 输出:{('purple', 'pink', 'lilac'), ('red', 'green', 'blue'), ('white', 'yellow', 'gray')} print(type(color_set)) # 输出:<class 'set'>
如果后续需要使用列表格式操作取出的元素,用list()方法将元组转回即可。
- 方案2:封装可哈希的自定义列表类(适用于需要保留序列可修改特性的场景)
如果确实需要存入可修改的序列类型,可以自己封装一个实现了__hash__方法的列表子类,通过序列化等方式计算固定哈希值,示例逻辑如下:
class HashableList(list): def __hash__(self): # 将列表内容转为元组计算哈希值 return hash(tuple(self)) color_set = {HashableList(['red', 'green', 'blue']), HashableList(['white', 'yellow', 'gray'])}
注意:修改自定义可哈希列表的元素后,哈希值会发生变化,需要从集合中删除旧元素、重新添加修改后的元素,避免出现哈希定位异常。
内容的提问来源于stack exchange,提问作者MD EMRUL EMRAN
相关产品推荐
相关产品推荐

