【Python进阶】用 Python 统计字数

问题描述:

用 Python 实现函数 count_words(),该函数输入字符串 s 和数字 n,返回 sn 个出现频率最高的单词。返回值是一个元组列表,包含出现次数最高的 n 个单词及其次数,即 [(<单词1>, <次数1>), (<单词2>, <次数2>), ... ],按出现次数降序排列。

您可以假设所有输入都是小写形式,并且不含标点符号或其他字符(只包含字母和单个空格)。如果出现次数相同,则按字母顺序排列。

例如:

print count_words("betty bought a bit of butter but the butter was bitter",3)

输出:

[(‘butter‘, 2), (‘a‘, 1), (‘betty‘, 1)]

解决问题的思路:

1. 将字符串s进行空白符分割得到所有的单词列表split_s,如:[‘betty‘, ‘bought‘, ‘a‘, ‘bit‘, ‘of‘, ‘butter‘, ‘but‘, ‘the‘, ‘butter‘, ‘was‘, ‘bitter‘]

2. 建立maplist,将split_s转化为元素为元组的列表形式,如:[(‘betty‘, 1), (‘bought‘, 1), (‘a‘, 1), (‘bit‘, 1), (‘of‘, 1), (‘butter‘, 1), (‘but‘, 1), (‘the‘, 1), (‘butter‘, 1), (‘was‘, 1), (‘bitter‘, 1)]

3. 合并maplist中元素,元组的第一个索引值相同,则将其第二个索引值相加。

// 备注:准备采用defaultdict。得到的数据如下:{‘betty‘: 1, ‘bought‘: 1, ‘a‘: 1, ‘bit‘: 1, ‘of‘: 1, ‘butter‘: 2, ‘but‘: 1, ‘the‘: 1, ‘was‘: 1, ‘bitter‘: 1}

4. 进行排序,按照key进行字母排序,得到如下:[(‘a‘, 1), (‘betty‘, 1), (‘bit‘, 1), (‘bitter‘, 1), (‘bought‘, 1), (‘but‘, 1), (‘butter‘, 2), (‘of‘, 1), (‘the‘, 1), (‘was‘, 1)]

5. 进行二次排序, 按照value进行排序,得到如下:[(‘butter‘, 2), (‘a‘, 1), (‘betty‘, 1), (‘bit‘, 1), (‘bitter‘, 1), (‘bought‘, 1), (‘but‘, 1), (‘of‘, 1), (‘the‘, 1), (‘was‘, 1)]

6. 使用切片取出频率较高的*组数据

总结:在python3上不进行defaultdict进行排序结果也是正确的,python2上不正确。defaultdict本身是没有顺序的,要区分列表,所以必须进行排序。

也可尝试自己写,不借助第三方模块

解决方案1(使用defaultdict):

  1 from collections import defaultdict
  2 """Count words."""
  3
  4 def count_words(s, n):
  5     """Return the n most frequently occuring words in s."""
  6     split_s = s.split()
  7     map_list = [(k,1) for k in split_s]
  8     output = defaultdict(int)
  9     for d in map_list:
 10         output[d[0]] += d[1]
 11     output1 = dict(output)
 12     top_n = sorted(output1.items(), key=lambda pair:pair[0], reverse=False)
 13     top_n = sorted(top_n, key=lambda pair:pair[1], reverse=True)
 14
 15     return top_n[:n]
 16
 17
 18 def test_run():
 19     """Test count_words() with some inputs."""
 20     print(count_words("cat bat mat cat bat cat", 3))
 21     print(count_words("betty bought a bit of butter but the butter was bitter", 4))
 22
 23
 24 if __name__ == ‘__main__‘:
 25     test_run()

解决方案2(使用Counter)

  1 from collections import Counter
  2 """Count words."""
  3
  4 def count_words(s, n):
  5     """Return the n most frequently occuring words in s."""
  6     split_s = s.split()
  7     split_s = Counter(name for name in split_s)
  8     print(split_s)
  9     top_n = sorted(split_s.items(), key=lambda pair:pair[0], reverse=False)
 10     print(top_n)
 11     top_n = sorted(top_n, key=lambda pair:pair[1], reverse=True)
 12     print(top_n)
 13
 14     return top_n[:n]
 15
 16
 17 def test_run():
 18     """Test count_words() with some inputs."""
 19     print(count_words("cat bat mat cat bat cat", 3))
 20     print(count_words("betty bought a bit of butter but the butter was bitter", 4))
 21
 22
 23 if __name__ == ‘__main__‘:
 24     test_run()
 25 

原文地址:https://www.cnblogs.com/yongqiangyue/p/9006862.html

时间: 2024-10-12 10:12:47

【Python进阶】用 Python 统计字数的相关文章

Python进阶(四十)-数据可视化の使用matplotlib进行绘图

Python进阶(四十)-数据可视化の使用matplotlib进行绘图 前言 ??matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包.我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图.实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间.用户在熟悉了核心对象之后,可以轻易的定制图像.matplotlib的对象体系也是计算机图形学的一个优秀范例.即使你不是Python程序员,你也可以从文中

python进阶强化学习

最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类的装饰器 进程和线程 内存管理和垃圾回收机制 基本使用 基本的数据包括:list,tuple(元组),set(集合)和dict(字典).heapq.queue 处理的实际问题是:过滤列表中的负数 解决方案: 列表解析,最好的方式 字典,使用字典的方式和使用列表的方式差不多,都是对value做判断,但

Python 进阶 笔记

慕课网 Python 进阶 http://www.imooc.com/learn/317 笔记 # start: pass # 定义Person类的__init__方法,除了接受 name.gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例: class Person(object): count = 0 #定义类属性    def __init__(self, name, gender, birth, **kw):        self.name = na

有哪些比较好的讲Python进阶的博客?

Python是一种动态解释型的编程语言,它可以在Windows.UNIX.MAC等多种操作系统以及Java..NET开发平台上使用.不过包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.因此如何进阶Python显得非常重要. 接下来看看比较好的讲Python进阶的博客,我这有十个,希望对你有帮助. 第一个是Planet Python,这是最出名的python博客其中之一: 第二个博客是Eli Bendersky 的博客:Eli Bendersky's website: 第三个博客是Code

python进阶十_正则表达式(一)

最近状态一直不太好,至于原因,怎么说呢,不好说,总之就是纠结中覆盖着纠结,心思完全不在点上,希望可以借助Python的学习以及博客的撰写来调整回来,有的时候回头想一想,如果真的是我自己的问题呢,以前我经常跟别人说,千万不要怀疑自己,因为很清楚一旦连自己都变的不可信,那这个世界就太疯狂了,当一遍一遍的问我,现在连我自己都快怀疑自己了,我一遍一遍的说服别人,想不到现在竟然需要自己去说服自己,何其的悲哀~ 一.正则表达式基础 1.基本概念 正则表达式是计算机科学的一个概念.正则表达式使用单个字符串来描

Python进阶(三十五)-Fiddler命令行和HTTP断点调试

Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令 ??上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的session不是同一个概念,这里的每条HTTP请求都称为一个session).界面中能够看到Fiddler抓取的全部HTTP请求.而为了更加方便的管理全部的session, Fiddler提供了一系列内置的函数用于筛选和操作这些session(习惯命令行操作Linux的童鞋应该能够感受到这会有多么方便

Python进阶(三十四)-Python3多线程解读

Python进阶(三十四)-Python3多线程解读 线程讲解 ??多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度. 程序的运行速度可能加快. 在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等. ??线程在执行过程中与进程还是有区别的.每个独立

python进阶ing——创建第一个Tornado应用

python进阶ing——创建第一个Tornado应用 分类: Python2013-06-02 23:02 1725人阅读 评论(2) 收藏 举报 pythonTornado 每天在群里跟很多群友讨论一些问题,觉得对自己的技术提升有很大的帮助,也可以集思广益,学到一些自己以前从没有接触到过的东西,比如Tornado,最近听见群里好多朋友都在讨论这个,于是我也跟风了解了一下. Tornado是一个高效可扩展的非阻塞式web服务器以及其相关工具的开源版本,和当前主流的web服务器框架相比,明显的区

Python+Mysql生成zabbix统计数据

先大概了解一下zabbix数据库结构: 1.groups表 可以根据组名查到组ID 2.找到组ID就可以根据组ID找出这个组下面的所有服务器的ID,这个关系在hosts_groups表里面: 3.有了hostid就可以在hosts表里查看这台机器的基本信息了: items表则可以根据hostid查出这台服务器的所有监控项: 4.终于在items表查到itemid,利用这个itemid在trends和trends_uint这两个表中统计出我们需要的数据 我python水平挺菜的,很多面向对象的功能

python进阶八_警告和异常

心情有点纠结,怎么说呢,倒不是因为其他学习上的事情,反而是因为生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是因为交流不够,彼此不够了解吧,希望能尽快度过这一段纠结的日子,简单的生活,慢慢的品味,细细的思考. 最近一段时间,因为需要,借阅了一本Python Cookbook,发现这本书在很多方面介绍的都很不错,比如一些系统管理,web,分布式编程,数据持久化等等这些方面.但是却没有发现详细的关于错误和异常的一些介绍,本着作死的态度打算好好研究一下. 首先,照例,我们先来看