统计序列中元素的出现频度

统计序列中元素的出现频度

常规解法:迭代

该问题的实际场景主要有两种,一是单纯的统计序列中元素的出现的次数,二是统计某篇文章中出现频度最高的英语单词等。

# 首先先来使用列表解析创建一个随机的序列

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

如此,便完成了一个简单的词频统计。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181204G008ZV00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券