I am getting TypeError: unhashable type: 'list', while trying to find the word frequency
I am getting TypeError: unhashable type: 'list', while trying to find the word frequency
我得到
TypeError: unhashable type: 'list'
当我尝试这段代码时:
from nltk import FreqDist
fd = FreqDist()
token_words = data['tweet_split'].apply(lambda tweet: tweet.split())
for i in token_words:
fd[i] += 1
print(fd)
虽然您没有具体说明 data
是什么,但 data['tweet_split']
可能会返回 list
个 list
,而 FreqDist
是一个可能是一个类似字典的对象。
因此,当您执行 fd[i] += 1
时,您正在使用 list
索引 fd
,而使用字典或在其实现中使用字典的东西是不可能的,因为列表不是可散列的。您可以将此处的 i
转换为 tuple
,例如 tuple(i)
,但不清楚这是否正是您想要的。
这是因为 Python 字典只能使用不可变对象进行索引,这些对象本质上是不可变的,具有不可变的哈希值。元组就像列表一样,因为它们是元素的集合,但主要区别之一是它们不能被修改,所以只要它们的内容也是不可变的,元组的哈希值就是常量:
>>> t = ('a', 'b', 'c')
>>> hash(t)
6876511439064834292
>>> l = ['a', 'b', 'c']
>>> hash(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
list
s 原则上可以散列,但问题是列表的元素可以就地添加、删除或修改,因此列表的散列不会是常量,并且因此不能用作字典键。
我得到
TypeError: unhashable type: 'list'
当我尝试这段代码时:
from nltk import FreqDist
fd = FreqDist()
token_words = data['tweet_split'].apply(lambda tweet: tweet.split())
for i in token_words:
fd[i] += 1
print(fd)
虽然您没有具体说明 data
是什么,但 data['tweet_split']
可能会返回 list
个 list
,而 FreqDist
是一个可能是一个类似字典的对象。
因此,当您执行 fd[i] += 1
时,您正在使用 list
索引 fd
,而使用字典或在其实现中使用字典的东西是不可能的,因为列表不是可散列的。您可以将此处的 i
转换为 tuple
,例如 tuple(i)
,但不清楚这是否正是您想要的。
这是因为 Python 字典只能使用不可变对象进行索引,这些对象本质上是不可变的,具有不可变的哈希值。元组就像列表一样,因为它们是元素的集合,但主要区别之一是它们不能被修改,所以只要它们的内容也是不可变的,元组的哈希值就是常量:
>>> t = ('a', 'b', 'c')
>>> hash(t)
6876511439064834292
>>> l = ['a', 'b', 'c']
>>> hash(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
list
s 原则上可以散列,但问题是列表的元素可以就地添加、删除或修改,因此列表的散列不会是常量,并且因此不能用作字典键。