统计序列中元素的出现频度
常规解法:迭代
该问题的实际场景主要有两种,一是单纯的统计序列中元素的出现的次数,二是统计某篇文章中出现频度最高的英语单词等。
# 首先先来使用列表解析创建一个随机的序列
fromrandomimportrandint
# 生成一个含有30个元素范围为0-20的随机序列
data=[randint(,20)for_inxrange(30)]
# 统计结果是一个字典,其中data中的元素为键,0为初始值
c=dict.fromkeys(data,)
# 迭代
forxindata:
c[x]+=1
printc
如此一来,就得到了序列中每个元素的出现次数。如果实际需求是找频度最高的前几个元素,可以对字典进行排序。(详见1.1 在列表、字典、集合中根据条件筛选数据,这里不再赘述。)可见,步骤虽然简单,但仍然是比较繁琐的。那么,有没有什么优雅的解决方案呢?
Python 中优雅的解决方案
使用下的对象,具体步骤:
将序列传入的构造器,得到对象是元素频度的字典。
方法得到频度最高的n个元素的列表。
fromrandomimportrandint
fromcollectionsimportCounter
data=[randint(,20)for_inxrange(30)]
c2=Counter(data)
# 获取所有元素的出现频度的字典
printc2
# 获取出现频度最高的3个元素
printc2.most_common(3)# 返回一个列表,如[(5,4),(10,3),(20,3)]
对英语文章进行词频统计
由于本人是考研党,所以这里,我直接使用了2015年考研英语1的第4篇阅读的文本为例,获取其出现频度最高的10个单词。
我已将上述文件传到七牛云中:http://airing.ursb.me/python/text.txt,因此待会的代码中直接使用读取网络文件。
fromcollectionsimportCounter
importre
importurllib2
# 读取网络文件并赋值于 txt 中
req=urllib2.Request('http://airing.ursb.me/python/text.txt')
response=urllib2.urlopen(req)
txt=response.read()
# 使用正则表达式分割 txt 中的单词存于序列中
# 再使用 Counter 进行频度统计返回字典
c3=Counter(re.split('\W+',txt))
printc3.most_common(10)
# 打印结果为:[('the', 31), ('of', 23), ('to', 10), ('that', 9), ('was', 7), ('and', 7), ('in', 7), ('not', 6), ('she', 6), ('be', 6)]
如此,便完成了一个简单的词频统计。
领取专属 10元无门槛券
私享最新 技术干货