我正在尝试获取元组列表的列表:类似于[ [(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作为参数。为什么一个工作(列表)而另一个不工作(设置)?
答案 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
构造了一组没有重复项的项,而列表可以包含任意数据。