python中的项频率计数

Dan*_*yar 54 python frequency count counting

我是一个蟒蛇新手,所以也许我的问题非常棒.假设我有一个单词列表,我想找到每个单词出现在该列表中的次数.明显的做法是:

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

但是我发现这个代码不是很好,因为这种方式程序运行两次单词列表,一次构建集合,第二次计算出现次数.当然,我可以编写一个函数来运行列表并进行计数,但这不会那么pythonic.那么,有更高效和pythonic的方式吗?

syk*_*ora 131

如果您使用的是python 2.7 +/3.1 +,那么集合模块中有一个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})
Run Code Online (Sandbox Code Playgroud)

由于2.7和3.1都处于测试阶段,因此您不太可能使用它,因此请记住,很快就可以获得执行此类工作的标准方法.


Tri*_*ych 94

默认拯救!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1
Run Code Online (Sandbox Code Playgroud)

这在O(n)中运行.

  • 这是一个非常古老的答案。请改用“计数器”。 (3认同)

nos*_*klo 11

标准方法:

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"
words = words.split()
result = defaultdict(int)
for word in words:
    result[word] += 1

print result
Run Code Online (Sandbox Code Playgroud)

Groupby oneliner:

from itertools import groupby

words = "apple banana apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result
Run Code Online (Sandbox Code Playgroud)


hop*_*pla 9

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

我认为这与Triptych的解决方案相同,但没有导入集合.也有点像Selinap的解决方案,但更可读的imho.几乎与Thomas Weigel的解决方案完全相同,但没有使用Exceptions.

这可能比使用集合库中的defaultdict()慢.由于获取了值,因此递增,然后再次分配.而不仅仅是递增.但是使用+ =可能在内部完成相同的操作.


Nic*_*sta 7

如果您不想使用标准字典方法(循环遍历列表,递增正确的字典.键),您可以尝试这样做:

>>> from itertools import groupby
>>> myList = words.split() # ['apple', 'banana', 'apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]
Run Code Online (Sandbox Code Playgroud)

它在O(n log n)时间内运行.