将单词列表转换为频率字典的最佳方法

ʞɔı*_*ɔıu 16 python

将列表/元组转换为dict的最佳方法是什么,其中键是列表的不同值,值是这些不同值的频率?

换一种说法:

['a', 'b', 'b', 'a', 'b', 'c']
--> 
{'a': 2, 'b': 3, 'c': 1}
Run Code Online (Sandbox Code Playgroud)

(我必须做很多次上面的事情,标准库中有什么东西可以帮你吗?)

编辑:

Jacob Gabrielson指出2.7/3.1分支的标准库中会出现一些问题

Sil*_*ost 31

我发现最容易理解(虽然可能不是最有效)的方法是:

{i:words.count(i) for i in set(words)}
Run Code Online (Sandbox Code Playgroud)

  • +1:得到一些Python 3.0语法糖. (2认同)
  • 非常优雅...但在最坏(但现实)的情况下,接近二次成本.应小心使用. (2认同)

S.L*_*ott 20

的种类

from collections import defaultdict
fq= defaultdict( int )
for w in words:
    fq[w] += 1
Run Code Online (Sandbox Code Playgroud)

这通常很有效.


Jac*_*son 10

请注意,从Python 2.7/3.1开始,此功能将内置到collections模块中,有关详细信息,请参阅此错误.以下是发行说明中的示例:

>>> from collections import Counter
>>> c=Counter()
>>> for letter in 'here is a sample of english text':
...   c[letter] += 1
...
>>> c
Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2,
'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1,
'p': 1, 'r': 1, 'x': 1})
>>> c['e']
5
>>> c['z']
0
Run Code Online (Sandbox Code Playgroud)

  • 你可以简单地做`Counter(word_list)`. (4认同)
  • 看起来比这更简单,看起来你可以将字符串传递给Counter构造函数,它就是为你做的 (2认同)

小智 7

其实Counter的回答已经提过了,但我们还可以做得更好(更简单)!

from collections import Counter
my_list = ['a', 'b', 'b', 'a', 'b', 'c']
Counter(my_list)  # returns a Counter, dict-like object
>> Counter({'b': 3, 'a': 2, 'c': 1})
Run Code Online (Sandbox Code Playgroud)