【问题标题】:Python TypeError: unhashable type: 'list'Python TypeError:不可散列的类型:'list'
【发布时间】:2013-01-23 02:12:41
【问题描述】:

我正在尝试运行一个有效地执行以下操作的程序:

if [4, 5, False, False, False, False] in {}

而且,在这条线上,我收到了TypeError: unhashable type 'list'

我做错了什么?

【问题讨论】:

  • 你到底想达到什么目的?
  • 我有一些看起来像 [4,5,False,False,False,False] 的数据结构,我想在无序列表中找到它们。 {} 就是这种事情的一个例子(我的代码当时碰巧失败了)。我现在使用列表而不是字典,效果更好。

标签: python list set typeerror


【解决方案1】:

代码if foo in {} 检查字典的任何键是否等于foo

在您的示例中,foo 是一个列表。列表是不可散列的类型,不能作为字典的键。

如果您想检查列表的任何条目是否包含在字典的键或集合中,您可以尝试:

if any([x in {} for x in (4, 5, False)]).

如果您想检查您的任何值是否等于您的列表,您可以尝试:

if any([v == [4, 5, False, False, False, False] for v in your_dict.values()])

【讨论】:

    【解决方案2】:

    set 包含可散列的对象,这意味着它们是可排序的,并且可以实现高效的搜索/插入方法。 另一方面,list 是不可散列的。这就是您的代码出错的原因。 我建议使用tuple 而不是list

    if (4, 5, False, False, False, False) in {}:
      ...
    

    【讨论】:

    • 这仍然写成if False:更有效。如果 OP 告诉我们她/他真正想要实现的目标,那将会更有用。
    • 感谢您注意到元组可以用作字典键而不是列表。
    【解决方案3】:

    你可以做类似的事情

    if all(x in {} for x in [4, 5, False, False, False, False]):
        ....
    

    if any(x in {} for x in [4, 5, False, False, False, False]):
        ....
    

    取决于你想要什么

    【讨论】:

    • any(x in {} for x in [4, 5, False]) 返回True。我对此感到惊讶,我猜any 将可迭代视为一个整体,而迭代器是正确的。所以应该是any([x in {} for x in [4, 5, False]])
    • @gerrit any(x in {} for x in [4, 5, False]) 在 Python 2.7 和 3.3 中为我返回 False
    • @JanneKarila 啊!我使用的是pylab,它是from numpy import *numpys any 正在遮蔽内置的 any
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2019-01-29
    • 2012-01-21
    • 2017-06-21
    • 2018-10-05
    • 2020-03-28
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多