词频与字典理解

时间:2016-11-15 14:05:45

标签: python dictionary

我试图使用字典来计算给定字符串上的字频率。说:

s = 'I ate an apple a big apple'

我知道计算字频率的最佳方法可能是使用collections.Counter。但我想知道我是否可以通过字典理解来解决这个问题。

我的原始方法(没有词典理解)是

dict = {}
for token in s.split(" "):
    dict[token] = dict.get(token, 0) + 1

并且工作正常:

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?但是,我不知道如何测试这个,所以我不是百分百肯定。

P.S。如果它有任何区别,我使用的是python 3。

3 个答案:

答案 0 :(得分:1)

如果您通过操作完成代码操作,您将看到错误。

首先将dict设置为空字典。 (正如评论中所提到的,将它用于您自己的变量名称是一个坏主意,但这不是问题所在。)

其次,评估你的词汇理解。此时,名称dict仍然引用空字典。因此,每次执行dict.get(whatever, 0)时,它始终会获得默认值。

最后,您填充的字典将重新分配给名称dict,替换之前存在的空字符。

答案 1 :(得分:1)

您也可以使用list.count(),因为:

s = 'I ate an apple a big apple'

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

答案 2 :(得分:0)

为了使词典理解起作用,你需要在其内部引用理解。像这样的东西会起作用

{token: __me__.get(token, 0) + 1 for token in s.split(" ")}

如果有“__me__”这样的东西引用正在构建的理解。在Python 3中,没有记录的方法来执行此操作。

根据this answer,可以在Python 2.5,2.6中使用未记录的“实现工件”(Python用户不应该依赖它)来编写自引用列表理解。对于Python 3中的字典理解也许存在类似的hack。