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

来源:互联网 发布:python range to list 编辑:程序博客网 时间:2024/06/05 16:59
实际案例
  • 某随机序列[12, 5, 6, 4, 6, 5, 5, 7, …]中,找到出现次数最高的3个元素,它们出现次数是多少?
  • 对某英文文章的单词,进行词频统计,找到出现次数最高的10个单词,它们出现次数是多少?

现在我们以序列为例,看下我们如何处理该问题。首先我们先创建一个序列,具体操作如下:

from random import randint# 创建随机数序列data = [randint(0, 5) for _ in xrange(20)]

我们思考一下,最终的统计结果必定是字典类型的。因此,我们可在上述的代码中进行如下操作:

# -*- coding: utf-8 -*-from random import randint# 创建随机数序列data = [randint(0, 5) for _ in xrange(20)]print data# 创建字典,以data序列的值为字典的键,值初始化为0c = dict.fromkeys(data, 0)print c# 遍历data序列for x in data:    c[x] += 1print c

输出结果如下:

[5, 0, 1, 5, 2, 5, 0, 4, 1, 2, 4, 1, 4, 1, 0, 3, 4, 2, 0, 4]{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}{0: 4, 1: 4, 2: 3, 3: 1, 4: 5, 5: 3}

这样,我们就统计出了序列中各个元素出现的次数。再回到实际案例中,案例1要求找到出现次数最高的3个元素。那我们就要根据字典的值,对字典的元素进行排序,具体操作如下:

# -*- coding: utf-8 -*-from random import randint# 创建随机数序列data = [randint(0, 5) for _ in xrange(20)]print data# 创建字典,以data序列的值为字典的键,值初始化为0c = dict.fromkeys(data, 0)print c# 遍历data序列for x in data:    c[x] += 1print c# 根据键值进行从大到小排序c_list = sorted(c.items(), key=lambda i:i[1], reverse=True)# 打印出现次数最多的3个元素print c_list[:3]

其输出结果如下:

[5, 0, 1, 5, 2, 5, 0, 4, 1, 2, 4, 1, 4, 1, 0, 3, 4, 2, 0, 4]{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}{0: 4, 1: 4, 2: 3, 3: 1, 4: 5, 5: 3}[(4, 5), (0, 4), (1, 4)]

除上述方法外,我们还可以使用collections.Counter对象处理该问题。首先,将序列传入Counter的构造器,得到Counter的对象是元素频度的字典;然后,我们利用Counter.most_common(n)方法得到频度最高的n个元素的列表;最后,我们输出频度最高的3个元素。collections.Counter的相关操作可具体参考Python官方文档,此处的代码具体如下所示:

# -*- coding: utf-8 -*-from random import randintfrom collections import Counter# 创建随机数序列data = [randint(0, 5) for _ in xrange(20)]print data# 创建字典,以data序列的值为字典的键,值初始化为0c = dict.fromkeys(data, 0)print c# 遍历data序列for x in data:    c[x] += 1print c# 统计元素的频率counter = Counter(data)# 打印出现次数最多的3个元素print counter.most_common(3)

其输出结果如下:

[5, 0, 1, 5, 2, 5, 0, 4, 1, 2, 4, 1, 4, 1, 0, 3, 4, 2, 0, 4]{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}{0: 4, 1: 4, 2: 3, 3: 1, 4: 5, 5: 3}[(4, 5), (0, 4), (1, 4)]

好了,实际案例中的第一个案例我们已经圆满解决了。现在,让我们看看实际案例中的第二个案例。第二个案例是要求我们对英文单词进行词频统计,这里我们就要采用正则表达式了。我们运用正则表达式把英文单词一个一个地分割出来,然后再使用collections.Counter对象进行词频统计,最后,我们输出出现次数最高的10个单词,其代码如下:

# -*- coding: utf-8 -*-import refrom collections import Counter# 读入test.txt文件text = open("test.txt").read()# 运用正则表达式做切割word_list = re.split("\W+", text)# 统计英文单词的词频counter = Counter(word_list)# 打印出现次数最多的10个元素print counter.most_common(10)

其中,输出结果如下:

[('in', 12), ('the', 11), ('as', 10), ('China', 9), ('by', 7), ('AI', 7), ('guideline', 6), ('and', 6), ('to', 5), ('intelligence', 5)]

代码中,test.txt文件的内容来自扇贝新闻。这样我们也圆满完成实际案例中的第二个案例。

简书个人主页:http://www.jianshu.com/u/766a46e00f6b

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 眼镜弹簧腿断了怎么办 眼镜腿螺丝太紧怎么办 眼镜金属柄断了怎么办 金属眼镜腿折了怎么办 眼镜腿中间断了怎么办 塑料眼镜腿断了怎么办 眼镜上的螺丝拧不紧怎么办 眼镜的把坏了怎么办 把眼镜坐坏了怎么办 梦见眼镜腿掉了怎么办 眼镜的腿掉了怎么办 眼镜腿的螺丝掉了怎么办 爱大爱眼镜掉腿了怎么办 合金眼镜腿断了怎么办 手关节复位h疼痛怎么办 我叫mt红色卡牌怎么办 星盟冲突qq登录怎么办 汽车雷达下雨一直响怎么办 火山小视频封火力怎么办 电脑被当成矿机怎么办 哥华有线机顶盒反应慢怎么办 电脑绣花机编码器坏了怎么办? 伺服电机开起没有力怎么办 西门子冰箱排水孔堵塞怎么办 数控车床西门子系统卡顿怎么办 手机系统不支持多屏互动怎么办 伺服驱动器系统错误报警怎么办 防雷接地电阻不符合规范怎么办 微信支付风控了怎么办 伺服电机没有配原点开关怎么办 电脑自带游戏打不开怎么办 战地1更新很慢怎么办 客户端提示初始化控件失败怎么办 刺客信条兄弟会存档损坏怎么办 百度不小心点赞怎么办 c盘空间不够了怎么办 百度云打开压缩文件失败怎么办 电脑只有一个c盘怎么办 u盘文件删不了怎么办 在电脑上照片打不开乱码怎么办 win7电脑登录密码忘记了怎么办