假设我有一个单词列表,我想找出每个单词在该列表中出现的次数。
一个显而易见的方法是:
words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)
但是我发现这段代码不是很好,因为程序运行了两次单词列表,一次是为了构建集合,第二次是为了计算出现的次数。
当然,我可以编写一个函数来遍历列表并进行计数,但这不是Pythonic式的。那么,有没有一种更有效、更高尚的方式呢?
发布于 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})
发布于 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)。
发布于 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()慢。因为该值被获取、递增,然后再次赋值。而不是仅仅递增。但是,在内部使用+=可能会做同样的事情。
https://stackoverflow.com/questions/893417
复制相似问题