Python中的项目频率计数

时间:2009-05-21 15:04:36

标签: python count frequency counting

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

这样做的一个显而易见的方法是:

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

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

当然,我可以编写一个函数来运行列表并进行计数,但这不会是Pythonic。那么,有更高效和Pythonic的方式吗?

11 个答案:

答案 0 :(得分:128)

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})

答案 1 :(得分:93)

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)中运行。

答案 2 :(得分:11)

标准方法:

from collections import defaultdict

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

print result

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

答案 3 :(得分:9)

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

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

这可能比使用集合库中的defaultdict()慢。由于获取了值,因此递增,然后再次分配。而不仅仅是递增。但是使用+ =可能会在内部做同样的事情。

答案 4 :(得分: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)]

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

答案 5 :(得分:3)

没有defaultdict:

words = "apple banana apple strawberry banana lemon"
my_count = {}
for word in words.split():
    try: my_count[word] += 1
    except KeyError: my_count[word] = 1

答案 6 :(得分:0)

你不能只使用计数吗?

words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1

答案 7 :(得分:0)

words = "apple banana apple strawberry banana lemon"
w=words.split()
e=list(set(w))       
for i in e:
   print(w.count(i))    #Prints frequency of every word in the list

希望这有帮助!

答案 8 :(得分:0)

我碰巧参加了一些Spark练习,这是我的解决方案。

tokens = ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

**#输出以上**

{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666, 'dog': 0.16666666666666666, 'quick': 0.16666666666666666}

答案 9 :(得分:0)

使用reduce()将列表转换为单个字典。

words = "apple banana apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})

返回

{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}

答案 10 :(得分:-1)

以下答案需要一些额外的周期,但这是另一种方法

def func(tup):
    return tup[-1]


def print_words(filename):
    f = open("small.txt",'r')
    whole_content = (f.read()).lower()
    print whole_content
    list_content = whole_content.split()
    dict = {}
    for one_word in list_content:
        dict[one_word] = 0
    for one_word in list_content:
        dict[one_word] += 1
    print dict.items()
    print sorted(dict.items(),key=func)