如何修复TypeError:unhashable类型:' list'错误

时间:2015-01-18 23:40:14

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

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

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'

有人可以尽快帮助我 感谢。

3 个答案:

答案 0 :(得分:3)

当您尝试在TypeError: unhashable type: 'list' Error(或listdict的成员)中使用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'}

答案 1 :(得分:2)

Counter需要一个可迭代的参数,每个项的可哈希(==可以是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))

答案 2 :(得分:0)

尝试将任何列表lst投射到frozenset(lst)