python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...

我有一个用python编写的列表,其中充满了文本。就像每个文档中的固定单词。所以对于每个文档,我都有一个列表,然后在列表中列出所有文档。

所有列表只包含唯一的单词。我的目的是计算完整文档中每个单词的出现次数。我可以使用以下代码成功完成此操作:for x in texts_list:

for l in x:

if l in term_appearance:

term_appearance[l] += 1

else:

term_appearance[l] = 1

但我想用字典理解来做同样的事情。这是我第一次尝试编写字典理解,并使用StackOverflow中以前的现有文章,我能够编写以下内容:

from collections import defaultdict

term_appearance = defaultdict(int)

{{term_appearance[l] : term_appearance[l] + 1 if l else term_appearance[l] : 1 for l in x} for x in texts_list}

上一篇参考文章:

Simple syntax error in Python if else dict comprehension

如上所述,我还使用了以下代码:

{{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list}

上面的代码成功地生成了空列表,但最终抛出了以下跟踪:

[]

[]

[]

[]

Traceback (most recent call last):

File "term_count_fltr.py", line 28, in

{{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list}

File "term_count_fltr.py", line 28, in

{{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list}

TypeError: unhashable type: 'dict'

如果能帮助我提高目前的理解力,我将不胜感激。

看到上面的错误,我也试过了

[{l : term_appearance[l] + 1 if l else 1 for l in x} for x in texts_list]

运行时没有任何错误,但输出仅为空列表。

最佳答案

就像其他答案中解释的那样,问题是字典理解创建了一个新的字典,所以直到新字典被创建之后,您才可以得到它的引用。你不能对你正在做的事进行字典理解。

鉴于此,您所做的就是尝试重新实现collections.Counter已经完成的工作。您只需使用Counter。示例-from collections import Counter

term_appearance = Counter()

for x in texts_list:

term_appearance.update(x)

演示-

>>> l = [[1,2,3],[2,3,1],[5,4,2],[1,1,3]]

>>> from collections import Counter

>>> term_appearance = Counter()

>>> for x in l:

... term_appearance.update(x)

...

>>> term_appearance

Counter({1: 4, 2: 3, 3: 3, 4: 1, 5: 1})

如果你真的想在某种程度上理解这一点,你可以做到:

from collections import Counter

term_appearance = Counter()

[term_appearance.update(x) for x in texts_list]

演示-

>>> l = [[1,2,3],[2,3,1],[5,4,2],[1,1,3]]

>>> from collections import Counter

>>> term_appearance = Counter()

>>> [term_appearance.update(x) for x in l]

[None, None, None, None]

>>> term_appearance

Counter({1: 4, 2: 3, 3: 3, 4: 1, 5: 1})

输出[None, None, None, None]来自导致该列表的列表理解(因为它是以交互方式运行的),如果在脚本中以python

还可以使用itertools.chain.from_iterable()从文本列表创建扁平列表,然后将其用于计数器。例子:

from collections import Counter

from itertools import chain

term_appearance = Counter(chain.from_iterable(texts_list))

演示-

>>> from collections import Counter

>>> from itertools import chain

>>> term_appearance = Counter(chain.from_iterable(l))

>>> term_appearance

Counter({1: 4, 2: 3, 3: 3, 4: 1, 5: 1})

另外,在您的原始代码行中的另一个问题-

{{term_appearance[l] : term_appearance[l] + 1 if l else term_appearance[l] : 1 for l in x} for x in texts_list}

这实际上是一个集合理解,其中嵌套了一个字典理解。

这就是您得到错误的原因-TypeError: unhashable type: 'dict'。因为在第一次运行字典理解并创建一个dict之后,它试图将其添加到set中。但是字典是不可散列的,因此出现了错误。

你可能感兴趣的:(python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...)