无法将列表转换为集合,引发“无法散列的类型:'列表'"错误 [英] Unable to convert list into set, raises "unhashable type: 'list' " error

查看:114
本文介绍了无法将列表转换为集合,引发“无法散列的类型:'列表'"错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我试图找到列表的所有子列表,这就是我现在拥有的.我是Python的新手,我不明白为什么"Q3_ans = set(ans)"会引发错误.我试图将列表转换为以前设置的列表,并且可以正常工作.

So I'm trying to find all sub-lists of a list and here is what I have now. I'm new to Python and I don't understand why " Q3_ans=set(ans)" raises an error. I've tried to convert a list to set before and it works.

def f2(seq):
    '''
    This is the base case of the recursion from function all_sublists
    '''
    assert len(seq)==2
    assert isinstance(x,list)
    a,b=seq
    return [[a],[b],[a,b]]


def all_sublists(x):
    '''
    This function will generate all of the sublists of a list, not including the empty one, using recursion
    '''
    assert isinstance(x,list)
    ans=[]
    for i in range(0,len(x)-1):
        for j in range(1,len(x)):
            temp=[x[i],x[j]]
            temp=[f2(temp)]
            ans.extend(temp)
    Q3_ans=set(ans) 
    return Q3_ans

这是我运行代码时的错误 y = [1,2,3,4,5]

Here is the error when I run my code y=[1,2,3,4,5]

all_sublists(y)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-108-f8b1bb0a7001> in <module>
----> 1 all_sublists(y)

<ipython-input-106-84f4f752e98e> in all_sublists(x)
     10             temp=[f2(temp)]
     11             ans.extend(temp)
---> 12     Q3_ans=set(ans)
     13     return Q3_ans

TypeError: unhashable type: 'list'

推荐答案

这是问题的本质:

>>> set([[["a"],["b"],["a","b"]]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

那是什么意思?

set([iterable])

返回一个新的set对象,该对象的元素均来自于iterable. 集合中的元素必须是可散列的.

可哈希

如果对象具有从不改变的哈希值,则该对象是可哈希的 在其生命周期内(需要使用__hash__()方法),并且可以 与其他对象相比(它需要一个__eq__()方法).可散列 比较相等的对象必须具有相同的哈希值.

An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__() method). Hashable objects which compare equal must have the same hash value.

可哈希性使对象可用作字典键和集合 成员,因为这些数据结构在内部使用哈希值.

Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally.

Python的所有不可变内置对象都是可哈希的; 可变 容器(例如列表或词典)不是.

All of Python’s immutable built-in objects are hashable; mutable containers (such as lists or dictionaries) are not.

此处的关键字是 可变

The keywords here are mutable

可变对象可以更改其值,但保留其id().

Mutable objects can change their value but keep their id().

不可变

具有固定值的对象.不可变的对象包括数字, 字符串和元组.这样的对象不能改变.有一个新对象 如果必须存储其他值,则创建该属性.他们玩 在需要恒定哈希值的地方起着重要的作用 例如作为字典中的键.

An object with a fixed value. Immutable objects include numbers, strings and tuples. Such an object cannot be altered. A new object has to be created if a different value has to be stored. They play an important role in places where a constant hash value is needed, for example as a key in a dictionary.

因此,不能将list用作set元素. tuple可以工作:

So, you can't use a list as set element. A tuple would work:

>>> set([(("a"),("b"),("a","b"))])
{('a', 'b', ('a', 'b'))}

这篇关于无法将列表转换为集合,引发“无法散列的类型:'列表'"错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆