【问题标题】:How do I fix TypeError: unhashable type: 'list' Error如何修复 TypeError: unhashable type: 'list' 错误
【发布时间】:2015-03-16 22:55:13
【问题描述】:

我一直在寻找其他问题,但没有找到任何帮助。 我得到了这个代码:

def pairs(self, listOrString):
        if listOrString:
            return filter(re.compile(self.pairwise(self.text)).match, frozenset(self.text))
        else:
            return ' '.join(filter(re.compile(self.pairwise(self.text)).match, frozenset(self.text)))

def pairs_freqency(self):
    return Counter(self.pairs(True))

def sum_pairs(self):
        return len(self.ngrams(self.letters(list),2))

def pair_probability(self):
{pair : freqency / self.sum_pairs() for (pair, freqency) in self.pairs_freqency().iteritems()}

def pairwise(self, sequence):
    x,y = tee(sequence)
    next(y)
    return zip(x,y)

但是当我尝试打印时:

print pairs_freqency()

我收到此错误:

**更新

     Traceback (most recent call last):
  File "...", line 281, in <module>
    print pairs(string, text)
  File "...", line 46, in get_pairs
    return filter(re.compile(self.pairwise(self.text)).match, frozenset(self.text))
  File "...", line 190, in compile
    return _compile(pattern, flags)
  File "...", line 232, in _compile
    p = _cache.get(cachekey)
TypeError: unhashable type: 'list'

谁能尽快帮助我。
谢谢。

【问题讨论】:

  • 你肯定会让任何人尽可能难以真正帮助你(更不用说“尽可能快”),通过点点滴滴地揭示你的代码,而且总是部分地。现在我们知道 pairwise 返回一个列表(这就是 zip 在 Python 2 中返回的内容)并且您正在尝试 re.compile 一个列表,这是不可能的,尽管错误 should 是TypeError: first argument must be string or compiled pattern。如果可能的话,你想通过“重新编译一个列表”来完成什么——你对这样的编译有什么期望(错误地)?!
  • 成功了! :-) 非常感谢。

标签: python list python-2.7 error-handling typeerror


【解决方案1】:

TypeError: unhashable type: 'list' Error 发生在您尝试使用list 作为dict(或set 或frozenset 的成员)中的键时。解决此问题的标准方法是将list 转换为tuple,例如:

In [4]: my_dict = {[2,3,4] : 'a'}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-cda6d34218c4> in <module>()
----> 1 my_dict = {[2,3,4] : 'a'}

TypeError: unhashable type: 'list'

In [5]: my_dict = {tuple([2,3,4]) : 'a'}
In [6]: my_dict
Out[6]: {(2, 3, 4): 'a'}

【讨论】:

    【解决方案2】:

    Counter 需要一个可迭代的参数作为其参数,其中的每一项都是hashable(==可以是dict 的键)。您的项目是列表,它们不可散列(因为它们是可变的)。修复:改为使用元组,特别是在您的 pairs 方法中——而不是

        return filter(re.compile(self.pairwise(self.text)).match, list(self.text))
    

    使用

        return filter(re.compile(self.pairwise(self.text)).match, tuple(self.text))
    

    【讨论】:

    • @Borgmester 我看到错误实际上在re.compile(self.pairwise(self.text)) 中——它实际上并没有达到我的(仍然需要的)修复会有所帮助的地步。所以向我们展示self.pairwise(self.txt) 返回的内容(以及该pairwise 的代码),到目前为止您还没有展示(编辑您的Q,它在cmets 中不可读)。
    • @Borgmester,如果self.text 是一个字符串,来自re.compile 的错误将是TypeError: first argument must be string or compiled pattern。那么是 self.text 是什么?在任何情况下,pairwise 返回一个zip 结果(一个列表,碰巧,但一个元组也不会更好)并且对于re.compile,它永远不会是正确的参数类型。那么是 self.text,你认为re.compileing那个zip会做什么?!
    【解决方案3】:

    尝试将任何列表 lst 转换为 frozenset(lst)。

    【讨论】:

    • 我不明白,你能给我举个例子吗?
    • 我无法跟踪您的回溯,但如果您能找到列表,请将 frozenset() 放在它周围。
    • tuple 不是 list 比 frozenset 更好的可散列替代品吗?
    • 或许,这只是一种偏好。
    • return filter(re.compile(self.pairwise(self.text)).match, frozenset(self.text))
    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 2015-02-11
    • 2012-11-20
    • 1970-01-01
    • 2019-10-11
    • 2020-03-27
    • 2020-05-11
    相关资源
    最近更新 更多