首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的项目频率计数

Python中的项目频率计数
EN

Stack Overflow用户
提问于 2009-05-21 15:04:36
回答 12查看 134.4K关注 0票数 67

假设我有一个单词列表,我想找出每个单词在该列表中出现的次数。

一个显而易见的方法是:

words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)

但是我发现这段代码不是很好,因为程序运行了两次单词列表,一次是为了构建集合,第二次是为了计算出现的次数。

当然,我可以编写一个函数来遍历列表并进行计数,但这不是Pythonic式的。那么,有没有一种更有效、更高尚的方式呢?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-05-21 15:16:59

collections模块中的Counter class就是专门为解决此类问题而构建的:

from collections import Counter
words = "apple banana apple strawberry banana lemon"
Counter(words.split())
# Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})
票数 146
EN

Stack Overflow用户

发布于 2009-05-21 15:11:00

defaultdict出手相救!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1

它的运行时间为O(n)。

票数 95
EN

Stack Overflow用户

发布于 2009-06-11 20:21:45

freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

我认为这与Triptych的解决方案的结果相同,但没有导入集合。也有点像Selinap的解决方案,但更具可读性。几乎与Thomas Weigel的解决方案相同,但没有使用异常。

然而,这可能比使用集合库中的defaultdict()慢。因为该值被获取、递增,然后再次赋值。而不是仅仅递增。但是,在内部使用+=可能会做同样的事情。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/893417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档