TypeError: unhashable type

Python中列表转元组解决TypeError: 'list' object is not hashable
本文探讨了在Python编程中遇到的TypeError:'list' object is not hashable问题,重点讲解了为何列表不能用作字典键,以及如何通过将列表转换为元组来修复这一问题。通过实例演示了如何避免此类错误并确保字典键的可哈希性。

TypeError: unhashable type

TypeError: unhashable type: ‘list’ 通常意味着您正在尝试使用列表作为哈希参数。这意味着当您尝试散列一个 不可散列的对象 时,它将导致错误。例如。当您使用列表作为 字典中的键时,这是无法完成的,因为无法对列表进行哈希处理。解决此问题的标准方法是将 list 转换为 tuple

例子

my_dict = {'name': 'John', [1,2,3]:'values'}
print(my_dict)

输出

Traceback (most recent call last):
File "sample.py", line 3, in <module>
my_dict = {'name': 'John', [1,2,3]:'values'}
TypeError: unhashable type: 'list'

此错误表明 my_dict 键 [1,2,3] 是 List 并且 List 不是 Python中的可散列类型。字典键必须是不可变类型,而 list 是可变类型。

修复:将列表转换为元组

如果要将列表作为键放入 字典中,则必须将它们更改为元组。

my_dict = {'name': 'John', tuple([1,2,3]):'values'}
print(my_dict)

输出

{'name': 'John', (1, 2, 3): 'values'}

hash() 是一个内置的 python 方法,用于返回一个 唯一 的数字。这可以应用于任何用户定义的对象,一旦初始化就不会改变。此属性主要用于 字典键

可散列对象的示例:

int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes

Unhashable 对象的示例:

list, dict, set, bytearray, user-defined classes

元组和列表(tuple、list)

尽管 元组 可能看起来类似于列表,但它们通常用于不同的情况和不同的目的。元组是 不可变的,通常包含通过解包索引访问的异构元素序列 。列表是可变的,它们的元素通常是同质的,可以通过遍历列表来访问。

散列(Hashing)

散列是计算机科学中的一个概念,用于创建 高性能的伪随机访问数据结构,其中大量数据将被快速存储和访问。 不可变对象或无法更改的对象是可 散列 的,并且它们具有一个永远不会改变的唯一值。散列函数是一个函数,它接受一个对象,比如一个字符串,比如“Java”,并返回一个固定大小的代码,假设返回值是一个 整数

`TypeError: unhashable type: 'list'` 错误通常在代码尝试将列表作为字典的键或集合的元素时出现,因为列表是可变对象,不可哈希,而字典的键和集合的元素需要是可哈希的对象(如整数、字符串、元组等)。 下面从代码中可能出现该错误的常见场景来分析: ### 字典操作 如果代码中有使用列表作为字典键的操作,会引发此错误。例如: ```python my_dict = {} my_list = [1, 2, 3] # 这行代码会引发 TypeError: unhashable type: 'list' my_dict[my_list] = 'value' ``` 解决办法是将列表转换为可哈希的类型,如元组: ```python my_dict = {} my_list = [1, 2, 3] my_tuple = tuple(my_list) my_dict[my_tuple] = 'value' print(my_dict) ``` ### 集合操作 当尝试将列表添加到集合中时,也会出现此错误。例如: ```python my_set = set() my_list = [1, 2, 3] # 这行代码会引发 TypeError: unhashable type: 'list' my_set.add(my_list) ``` 解决办法同样是将列表转换为元组: ```python my_set = set() my_list = [1, 2, 3] my_tuple = tuple(my_list) my_set.add(my_tuple) print(my_set) ``` ### 结合代码中使用 torch 和加载 `.mat` 文件的操作 在使用 `torch` 时,可能会在自定义的字典或集合操作中出现该错误。例如自定义一个字典来存储张量和对应的标签,错误示例如下: ```python import torch tensor_dict = {} tensor = torch.tensor([1, 2, 3]) label = [4, 5, 6] # 这行代码会引发 TypeError: unhashable type: 'list' tensor_dict[label] = tensor ``` 解决办法: ```python import torch tensor_dict = {} tensor = torch.tensor([1, 2, 3]) label = [4, 5, 6] label_tuple = tuple(label) tensor_dict[label_tuple] = tensor print(tensor_dict) ``` 在加载 `.mat` 文件时,如果对加载的数据进行字典或集合操作,也可能出现该错误。例如: ```python import scipy.io as sio mat_data = sio.loadmat('your_file.mat') data_list = mat_data['your_key'] my_set = set() # 这行代码可能会引发 TypeError: unhashable type: 'list' my_set.add(data_list) ``` 解决办法: ```python import scipy.io as sio mat_data = sio.loadmat('your_file.mat') data_list = mat_data['your_key'] data_tuple = tuple(data_list.flatten()) my_set = set() my_set.add(data_tuple) print(my_set) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值