Python中的项频计数
假设我有一个单词列表,我想找出每个单词在这个列表中出现的次数。
一个明显的方法是:
words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)
但是我觉得这个代码不太好,因为程序要遍历单词列表两次,第一次是为了创建一个集合,第二次是为了计算出现的次数。
当然,我可以写一个函数来遍历这个列表并进行计数,但那样就不太符合Python的风格了。那么,有没有更高效、更符合Python风格的方法呢?
14 个回答
12
freqs = {}
for word in words:
freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize
我觉得这个方法和Triptych的解决方案差不多,但不需要引入collections库。还有点像Selinap的解决方案,但我觉得更容易理解。几乎和Thomas Weigel的解决方案一模一样,只是没有使用异常处理。
不过,这个方法可能比使用collections库里的defaultdict()要慢一些。因为它是先获取值,再加一,然后再赋值回去。而不是直接加一。不过使用+=可能在内部做的也是一样的事情。
95
有了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),也就是说它的运行时间和数据的数量成正比。
150
collections
模块中的Counter
类是专门用来解决这种类型问题的:
from collections import Counter
words = "apple banana apple strawberry banana lemon"
Counter(words.split())
# Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})