我试图使用字典来计算给定字符串上的字频率。说:
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。
答案 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。