【问题标题】:Python Error HandlingPython 错误处理
【发布时间】:2012-07-29 09:24:47
【问题描述】:

我试图将列表转换为集合,代码如下:

set1=set(list1)

代码运行正常,但突然开始报以下错误,

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

请告诉我如何解决。

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

【问题讨论】:

  • list1的内容是什么?
  • 我有点不高兴你的问题被这么多反对,如果你没有立即意识到包含 的列表,错误消息 可能 会令人困惑另一个 列表是错误的原因。请大家给新用户休息一下好吗?
  • 抱歉在这里获取元数据,Martjin,但鉴于海报的传记和 SO 历史,我们在这里没有新手,但应该知道如何阅读常见问题解答和建议的人以前的帖子,但谁似乎没有。 (不过,我没有投反对票,主要是因为我没有)。这个问题非常不完整。
  • @msw:好的,你说得有道理;只看到1点声望就下结论了。我可以在一定程度上看到错误消息是如何让新手感到困惑的,并且在 Stack Overflow 上存在一种可怕的倾向,即只是对“愚蠢”投反对票。

标签: python python-3.x python-2.7


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    集合只能包含hashable 的项目;任何不能被变异的标准类型都是可散列的,但 list 不是(它可以被变异)。相比之下,tuple 是不可变的,可以存储在 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
    

    【讨论】:

    • 我的列表不包含其他列表。先生,这就是担心。
    • @SUBHABRATA:错误消息似乎另有说明。如果没有更多代码,我们将无法为您提供更多帮助。使用异常处理程序来确定内容是什么,更新答案。
    • 使用 try_except 是一个不错的选择。我正在获取一个列表,对其进行操作,获取另一个空白列表,附加到空白列表,然后将其转换为一组简单的代码——我有我的方法来解决,但这有点原始我在想专家的帮助. pdb 我会检查的。谢谢和问候,Subhabrata。
    猜你喜欢
    • 2016-09-13
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多