【问题标题】:Word frequency with dictionary comprehension词频与字典理解
【发布时间】:2017-03-29 10:55:19
【问题描述】:

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

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?但是,我不知道如何对此进行测试,所以我不能 100% 确定。

附:如果有什么不同,我使用的是 python 3。

【问题讨论】:

  • 这是 collections.Counter(一个 dict 子类型)很久以前解决的问题
  • 我不会使用 dict 作为变量名,因为它是内置的,你可以这样做破坏一些东西
  • 变量dict 直到完全计算完后才会更新,因此理解中的dict.get(token, 0) 只会查询上一行中的空字典。
  • @MosesKoledoye 同意,只是想深入了解 dict 理解背后的机制。

标签: python dictionary


【解决方案1】:

如果你逐个操作地检查你的代码,你会发现哪里出了问题。

首先你将dict 设置为一个空字典。 (如 cmets 中所述,将其用作您自己的变量名是个坏主意,但这不是问题所在。)

其次,评估您的 dict 理解。此时名称 dict 仍然指的是空字典。所以每次你dict.get(whatever, 0),它总是会得到默认值。

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

【讨论】:

    【解决方案2】:

    你也可以使用list.count(),如:

    s = 'I ate an apple a big apple'
    
    print  {token: s.split().count(token) for token in set(s.split())}
    

    【讨论】:

      【解决方案3】:

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

      {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。

      【讨论】:

        猜你喜欢
        • 2022-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 2021-07-24
        • 2016-09-03
        • 1970-01-01
        相关资源
        最近更新 更多