TypeError:不可用的类型

时间:2011-07-19 21:01:58

标签: python

我正在尝试获取元组列表的列表:类似于[ [(1,0),(2,0),(3,0)],[(1,1),(2,1),(3,1)....]] 我用过这句话

set([(a,b)for a in range(3)]for b in range(3))

但它给了我一个错误

TypeError: unhashable type: 'list'

我有两个关于Python Guru的问题:

a)当我查看Hashable的Python定义时 -

  

“如果一个对象具有一个在其生命周期内永远不会改变的哈希值(它需要一个哈希()方法),那么该对象是可以清除的”

当我在上面的表达式上使用dir函数时

dir([(a,b)for a in range(3)]for b in range(3))

好像说__hash__就在那里。那么,为什么我会收到错误?

我能够得到[[(0, 0), (1, 0), (2, 0)], [(0, 1), (1, 1), (2, 1)], [(0, 2), (1, 2), (2, 2)]] 使用list命令:

list(list((a,b) for a in range(3)) for bin range(3))

b)列表和设置都将Iterable作为参数。为什么一个工作(列表)而另一个不工作(设置)?

6 个答案:

答案 0 :(得分:24)

您正在通过set电话创建set(...)set需要可播放的商品。你不能有一套清单。因为列表不可用。

[[(a,b) for a in range(3)] for b in range(3)]是一个列表。它不是一种可洗的类型。你在dir(...)中看到的__hash__不是一种方法,它只是无。

列表推导返回一个列表,你不需要在那里明确使用列表,只需使用:

>>> [[(a,b) for a in range(3)] for b in range(3)]
[[(0, 0), (1, 0), (2, 0)], [(0, 1), (1, 1), (2, 1)], [(0, 2), (1, 2), (2, 2)]]

试试那些:

>>> a = {1, 2, 3}
>>> b= [1, 2, 3]
>>> type(a)
<class 'set'>
>>> type(b)
<class 'list'>
>>> {1, 2, []}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> print([].__hash__)
None
>>> [[],[],[]] #list of lists
[[], [], []]
>>> {[], [], []} #set of lists
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

答案 1 :(得分:9)

对于那些来自谷歌搜索的人寻找一个简单的答案:它与元组一起工作正常,但在创建集合时不适用于列表。

>>> {1, 2, [3, 4]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

>>> {1, 2, (3, 4)}
set([1, 2, (3, 4)])

答案 2 :(得分:6)

列表不可删除,因为其内容可能会在其生命周期内发生变化。您可以随时更新列表中包含的项目。

列表不使用散列进行索引,因此不限于可散列项。

答案 3 :(得分:5)

由于set不起作用的真实原因是因为它使用哈希函数来区分不同的值。这意味着集合仅允许可散列对象。为什么列表不可清除已经指出。

答案 4 :(得分:4)

...所以你应该这样做:

set(tuple ((a,b) for a in range(3)) for b in range(3))

...如果需要转换回列表

答案 5 :(得分:1)

您会发现list的实例未提供__hash__ - her,每个列表的属性实际上是None(尝试print [].__hash__)。因此,list是不可用的。

您的代码使用list而不是set的原因是因为set构造了一组没有重复项的项,而列表可以包含任意数据。