-1

我试图使用以下代码将列表转换为集合:

set1=set(list1)

代码运行良好,但突然开始出现以下错误,

set1=set(list1)
TypeError: unhashable type: 'list'

请让我知道我该如何解决。

有时一些运行良好的程序在没有更改参数的情况下突然出错,我该如何调试它?

4

2 回答 2

4

您的列表包含另一个列表:

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

集合只能包含可散列的项目;任何不能被变异的标准类型都是可散列的,但 alist不是(它可以被变异)。相比之下, atuple是不可变的,可以存储在 a 中set

错误会发生,即使在已经运行了一段时间的代码中也是如此。使用 print 语句调试它,或者更好的是,使用像pdb这样的调试器。

如果您的错误只是间歇性地出现,请使用try/except块来捕获错误,然后打印出信息或使用调试器来找出发生了什么:

try:
    set1=set(list1)
except TypeError:
    print 'list1 not hashable? contents: %r' % list1
    # optionally: import pdb; pdb.set_trace()
    raise
于 2012-07-29T09:28:19.580 回答
4

您的错误表明您的列表包含一个列表。列表是可变的,因此不能被散列用于集合或字典。一种解决方法是使用 将列表转换为元组tuple(some_list),但如果它们嵌套严重,它会变得更加复杂。

于 2012-07-29T09:28:29.813 回答