python的TypeError: unhashable type(list/set/dict)问题

今天在使用python处理一个列表时,遇到这样一个问题,列表里面的元素都是列表,我想把它去重,于是使用set处理一下,但是出现了这个error。

后来查了一下,原因是因为list是不能哈希的。


这一异常通常出现在,调用 set(…) 来构造一个 set (集合类型)时,set() 需要传递进来可哈希的元素(hashable items)。

  • (1)list、set、dict:是不可哈希的

    >>> list.__hash__
    None
    >>> set.__hash__
    None
    >>> dict.__hash__
    None
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • (2)int、float、str、tuple:是可以哈希的

    >>> int.__hash__
    <slot wrapper '__hash__' of 'int' objects>
    >>> float.__hash__
    <slot wrapper '__hash__' of 'float' objects>
    >>> str.__hash__
    <slot wrapper '__hash__' of 'str' objects>
    >>> tuple.__hash__
    <slot wrapper '__hash__' of 'tuple' objects>
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • (3)list 不使用 hash 值进行索引,故其对所存储元素没有可哈希的要求;set / dict 使用 hash 值进行索引,也即其要求欲存储的元素有可哈希的要求。

    >>> set([[], [], []])
    TypeError: unhashable type: 'list'
    >>> set([{}, {}, {}])
    TypeError: unhashable type: 'dict'
    >>> set([set(), set(), set()])
    TypeError: unhashable type: 'set'
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • (4)dict 仅对键(key)有可哈希的要求,对值(value)无此要求

    >>> dict([[["zhangsan", "lisi"], 20]])
    TypeError: unhashable type: 'list'
       
       
    • 1
    • 2
    • 1
    • 2

注:可能你会问,set 不是可以接受 list,并将其转换为 set 吗?比如set([1, 2, 3]),注意,上文说的可哈希,不可哈希,是对可迭代类型(iterables)所存储元素(elements)的要求,[1, 2, 3]是可迭代类型,其存储元素的类型为int,是可哈希的,如果set([[1, 2], [3, 4]])[[1, 2], [3, 4]]list of lists(list 构成的 list)自然是可迭代的,但其元素为 [1, 2] 和 [3, 4]是不可哈希的。

为什么 list 是不可哈希的,而 tuple 是可哈希的

  • (1)因为 list 是可变的在它的生命期内,你可以在任意时间改变其内的元素值。

  • (2)所谓元素可不可哈希,意味着是否使用 hash 进行索引

  • (3)list 不使用 hash 进行元素的索引,自然它对存储的元素有可哈希的要求;而 set 使用 hash 值进行索引。



  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
当出现TypeError: unhashable type: 'set'报错,通常是因为在使用set()函数,传递进来的元素不可哈希。set()函数只能接受可哈希的元素作为参数。 可哈希的元素包括int、float、str、tuple等,而不可哈希的元素包括listsetdict等。所以当将不可哈希的元素作为set()函数的参数,就会抛出TypeError: unhashable type: 'set'的异常。 解决此问题的方法是确保传递给set()函数的元素是可哈希的。如果要将一个列表作为set()函数的参数,可以先将列表转换为元组,因为元组是可哈希的。 例如,将一个列表转换为元组后再使用set()函数: ``` my_list = [1, 2, 3, 4, 5] my_set = set(tuple(my_list)) ``` 这样就可以避免TypeError: unhashable type: 'set'的错误了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python3 TypeError: unhashable type set解决方案](https://blog.csdn.net/weixin_34336526/article/details/89008436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python编码报错 TypeError: unhashable type set](https://blog.csdn.net/qq_45175681/article/details/123925651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [测量程序编制 - python 46数据类型:Set(集合)-添加.pptx](https://download.csdn.net/download/u011062044/85326440)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值