首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

0基础学Python之十六:字典(下)

Hi 大家好,我是王可乐。欢迎继续收看我们的“零基础学Python”课程。

上节课中,我们讲到了字典这个数据类型,它相对列表和元组来说,有不少独特的特性。比如,对于列表来说,如果你在赋值操作时,超过了列表索引的范围,Python会提示你索引超过范围。而在字典中做这个操作,不会有这个问题。例如:

但是,我们也演示过,如果字典中不存在一个关键词,那么尝试用这个关键词访问字典的时候,Python也是会报错的。我们来看一下:

可以看到,这里Python报了一个KeyError的错误,也就是说关键词错误。因此,在访问字典时,如果不确定字典里是否有关键词,就必须先用条件语句判断一下。比如:

如果在程序中经常出现关键字不存在的情况,在很多地方用 IF 语句来判断,代码会变得很凌乱。还好字典提供了解决这个问题的方法,那就是 get函数。

这个get 函数接受两个输入参数:第一个参数是要查找的关键词;第二个参数则是如果关键词在字典中不存在,get 函数返回的默认值。我们来试一下:

那么,如果不传入第二个参数的情况下,我们访问的关键词在字典中不存在,会有什么结果呢?这个问题,留个大家作为课后的实践练习,请大家自己去试一下。

上节课我们说过,字典不支持*号和+号操作符,因为字典中关键词是唯一的,而类列表中 *号和+号的行为和字典的这个逻辑有冲突。不过,Python 支持用一个字典来更新另一个字典的操作,使用的函数是字典的内置函数 update。我们还是看一下例子:

大家可以看到,原本字典x和字典y分别有三个元素,并且有一个共同的关键词:3。

在调用x的update函数时,Python用字典y的元素更新了字典x中的元素。首先,它为 x 增加了原先不存在的关键4和5,并赋予 y 中它们的值;然后,关键词3的值被更新成了4,和 y 中的值一致。所以,使用update函数,可以很方便地合并两个字典的元素。

当然有一点很重要,那就是,你必须得想清楚,到底该用谁去更新谁。

接下来,可乐再给大家介绍一个使用字典的技巧,字典推导式。看过之前节目的朋友一定还记得列表推导式,利用列表推导式能快速产生一个符合要求的列表。例如:

类似的,字典也可以由推导式产生,只不过字典的元素分为关键词和值,所以推导式也相对复杂一些,我们先来看一个简单的:

因为是字典推导式,所以上面整个语句要用大括号包裹起来。

此外,字典的元素包含关键词和值两部分,中间用冒号分隔,在推导式中也有体现。这里我们生成了一个关键词为列表x中元素,而值为对应关键词两倍的字典。和列表推导式一样,字典推导式也可以在for语句后面加上if条件,我们来试一试看:

当然,字典推导式的数据源不仅限于列表,各种数据源都可以。比如,我们可以用字典推导式实现一个字典关键词和值的互换。

这里,可乐要再次提醒大家注意的是,字典中元素的值并不是唯一的。如果字典中存在两个关键词的值相同,上面的推导式就会产生一些我们意想不到的结果。

具体会出现什么样的结果,以及背后的原因,就当做本节课的作业,请大家各自在课后思考和实践一下吧。

好了,字典的相关知识点,我们差不多讲完了。

本节课的最后,让我们来一起用之前学过的内容写一个完整的小程序。这个小程序的目标是统计一段英文中,每个单词出现的次数。这也是文本分析中的一个经典步骤:词频统计。我们来看代码:

我们先找一段英文文本。可乐在这里用的是泰戈尔写的诗《生如夏花》中的一段。

还记不记得这里的三引号,之前我们讲过,如果是多段落的字符串,可以用三个单引号来包裹,这样就不用担心换行的问题。

OK,有了文本,接下来第一步,我们需要把字符串头尾的空格都去掉,这里 strip() 函数帮我们做了这个操作。

然后,我们把字符串按照换行符“\n”切分开来,保存在一个列表里。这时 lines就是一个句子列表了,其中每一个元素都是诗中的一行。

接下来,我们定义一个空的字典,用于保存词频统计结果。

现在我们开始写一个 for 循环,在循环体内,我们对列表中的每一行,也就是诗句的每一行,先用字符串replace函数,把逗号都删去。由于我们这段英文文本没有其他标点符号,所以暂时可以先不考虑其他符号的处理。

然后呢,因为英文是有大小写的,我们统计词频时希望同一个单词无论大小写只统计一次。所以,我们先把大小写转换成一致的状态,这里,我们把单词都设置为小写。

接下来,我们就可以以空格为分隔符把单词都分开了,还是使用 split 函数,得到单词列表。分开单词以后,我们的字典就上场了。对于文中的每个单词,字典中都有一个元素来记录个数。

这里我们用到了get函数。这样,如果我们是第一次处理到某个单词,可以用默认的0,累加的处理方式就统一了。

循环完成后,我们希望能按照词频进行排序。

这里,我们用前面介绍过的 zip 函数来实现,并且直接用sort函数来对生成的列表排序。由于我们希望从高到底排列,所以这里还需要调用一下reverse函数。

最后,我们再次用一个循环把结果打印出来。我们来尝试运行一下。(打开终端,输入 python word_count.py),结果就出来了。

怎么样,看了这个例子之后,同学们对字典在实际场景中的应用已经有了一定的概念了吧?

好了,字典的知识我们就讲到这里,希望大家课后多多实践,熟练应用。

下一节课里,还有新的数据类型再等着我们,不要错过了哦。记得关注我们的公众号“可乐编程”,如果你觉得课程内容比较有趣,也请转发给你的朋友们,可乐感谢大家的支持,我们下次课再见!

往期课程:

《0基础学Python之十五:字典(上)》

《0基础学Python之十四:元组》

《0基础学Python之十三:列表(下)》

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券