Python 词频与词典理解

Python 词频与词典理解,python,dictionary,Python,Dictionary,我试着用字典计算给定字符串的词频。说: s = 'I ate an apple a big apple' 我知道计算词频的最好方法可能是使用集合。计数器。但是我想知道我是否可以通过使用字典来解决这个问题 我最初的方法(没有字典理解)是 而且效果很好: dict {'I': 1, 'a': 1, 'an': 1, 'apple': 2, 'ate': 1, 'big': 1} 我试着用字典来理解这个,比如 dict = {} dict = {token: dict.get(token, 0)

我试着用字典计算给定字符串的词频。说:

s = 'I ate an apple a big apple'
我知道计算词频的最好方法可能是使用
集合。计数器
。但是我想知道我是否可以通过使用字典来解决这个问题

我最初的方法(没有字典理解)是

而且效果很好:

dict
{'I': 1, 'a': 1, 'an': 1, 'apple': 2, 'ate': 1, 'big': 1}
我试着用字典来理解这个,比如

dict = {}
dict = {token: dict.get(token, 0) + 1 for token in s.split(" ")}
但这不起作用

dict
{'I': 1, 'a': 1, 'an': 1, 'apple': 1, 'ate': 1, 'big': 1}
字典理解有什么问题吗?是因为我在理解中使用了它自己,所以每次我在理解中调用dict.get('apple',0
),我都会得到
0
?然而,我不知道如何测试这一点,所以我不是100%确定


另外,如果有什么不同,我使用的是Python3。

如果您逐个操作地检查代码操作,您将看到哪里出了问题

首先,将
dict
设置为空dict(如注释中所述,将其用于自己的变量名是个坏主意,但这不是问题所在。)

其次,对你的听写理解进行评估。此时,名称
dict
仍然指空的dict。因此,每次执行
dict.get(无论如何,0)
,它都将获得默认值


最后,您填充的dict将重新分配给名称
dict
,以替换以前的空dict。

您也可以使用
list.count()
,如下所示:

s = 'I ate an apple a big apple'

print  {token: s.split().count(token) for token in set(s.split())}

为了让你的字典理解工作,你需要一个对理解本身的引用。像这样的东西会有用的

{token: __me__.get(token, 0) + 1 for token in s.split(" ")}
如果有像“
”这样的东西引用正在构建的理解。在Python3中,没有一个文档化的方法来实现这一点


根据,Python2.5、2.6中可以使用未记录的“实现工件”(Python用户不应该依赖于此)来编写自引用列表理解。Python 3中的字典理解可能也存在类似的问题。

这就是
集合。计数器
(dict子类型)很久以前就解决了。我不会使用dict作为变量名,因为它是一个内置的,您可以通过这样做来破坏某些东西,因此变量
dict
在理解完全计算之前不会被更新,因此,理解中的
dict.get(token,0)
只查阅前一行中的空字典。@MosesKoledoye同意,只是想深入了解dict理解背后的机制。
{token: __me__.get(token, 0) + 1 for token in s.split(" ")}