学习网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 38210|回复: 0
收起左侧

高级语言程序设计(Python) - 哈尔滨工业大学-7.1.1 视频1

[复制链接]
发表于 1-25 20:22 | 显示全部楼层 |阅读模式
大家好这节课我们学习本门课的最后一部分内容即字典和集合那么什么是字典呢其实字典就是一系列的键值对我们通过键可以查找到其对应的值其实字典这种数据结构和我们平时使用的纸质字典非常相像在纸质字典中我们通过单词索引表找到每个单词对应的定义字典一种数据结构在其他的编程语言中也都有所提供只是大家的名字不太一样比如在c++中叫做map而在Java中有hashtable或者hashmap我们平时使用的电话本就是一种典型的字典数据结构这里面的键就是人名而每个人名对应的电话号码呢就是值我们可以通过人名找到其对应的电话号码在Python中创建字典的方法就是使用成对的花括号而使用冒号表示一个键值对不同的键值对之间用逗号进行分割比如我们创建一个字典这里面键是字符串用它来表示人名冒号后面就是这个人对应的电话在创建字典的时候我们有一点需要注意的是键必须是不可变的类型而且不能够有重复得见而值呢可以是任意的类型如上面的字典中见是字符串他就是不可变的类型而使用整数呢来表示电话号码访问字典的方式和字符串以及上节课介绍的列表非常相像都使用成对的方括号来进行访问在字典中方括号内部不是整数了而是其对应的键作为索引比如我们创建上面的字典那么可以打印my_dic方括号呢是bob这样就会打印bob对应的电话号码而如果想打印tom对应的电话号码就会出错因为在上面我们创建的字典中只有这3个人没有Tom而如果找不到对应键的话程序呢就会抛出一个异常为了向字典中增加一个新的键值对就使用如下的方法非常简单就将新的值赋给其对应的键这样就创建了一个新的键值对下面我们可以实际的上机操作一下比如我们创建一个字典叫做my_dict其中有3个人第一个呢叫做John它对应的电话号码呢比如说叫1234第二个人呢如果叫bob它对应的电话号码叫做5678第三个呢比如说叫Mike它对应的电话号码是876好回车之后呢我们就创建了一个字典当然我们可以看一下创建的字典my_dict回车从中我们可以看到我们创建的顺序是John,Mike,bob当然字典输出的顺序呢是bob,John和Mike可见插入的顺序和最终字典的顺序是不一致的也就是说在字典中键值对是无序的然后通过索引的方式my_dict如bob这样就打印bob对应的电话呢是5678如果在说一个人名比如说Tom由于Tom呢并没有在字典中这样程序执行的结果呢就是抛出一个异常为了解决这个问题我们需要对他们重新的附一个电话号码比如叫5432好这时候我们再打印tom就可以打印它对应的电话号码是5432字典支持如下的运算符和方法第一个呢叫做len函数用它可以求字典中键值对的数量第二个呢叫做in运算符用它可以快速的判断一个key是不是在字典中那到底有多快呢他的时间复杂度是常数时间复杂度也就是说运行的时间并不随着字典规模的变化而变化会非常快的返回一个键是不是在字典中那么Python是如何做到这一点呢在这里面使用的是一种叫做哈西的数据结构当然本门课呢我们不会过多的介绍哈希数据结构其实in的运算符又等于下面的这个方法叫做has_key那他同样能够判断这个key是不是在字典中我们也可以通过for来枚举字典中的所有的键在这里面我们需要注意的是键的输出结果仍然是无序除此之外呢字典还支持更多的方法比如items他返回全部的键值对这些键值对呢是以列表的方式进行返回的而keys呢是返回全部的键也是一个列表values是返回全部的值最后clear是清空这个字典好下面我们就来上机操作一下我们可以通过len函数my_dict来看一下这里面一共有4个键值对然后呢我们还可以通过in这个运算符来判断一个key是不是在字典中如Tom inmy_dict返回结果就是true而另外一个人名比如eric由于eric并没有在字典中所以说他返回结果就是false然后呢我们可以通过for对其中的所有的键进行循环如for name in my_dict冒号然后print name这样我们就可以打印所有的4个人名了接着我们可以通过my_dict.items这个方法它会返回所有的键值对这里面我们需要注意的是返回的键值对呢是以列表的方式进行返回的而其中的每一个元素又是一个元组这个元祖呢是由一个键和一个值构成的这样的元组而my_dict.keys返回的呢就是所有的键而values呢返回的就是所有的值最后my_dict.clear他会清空字典让我们再看一下my_dict结果就是一个空字典由此我们可以看到用一个空的花括号就可以创建一个空字典下面我们看一个具体的例子比如读取一个字符串然后呢计算这个字符号中每一个字母出现的个数大家可能会想到一个非常简单的方案也就是说我们可以生成26个变量用他们来代表每个字母出现的个数比如变量a代表字母a出现的个数而变量b呢代表字母b出现的个数然后呢我们可以使用多分支结构也就是写26个if else判断读入的每一个字符到底是什么然后将相应变量加一我们在论坛中也看到有同学就使用这种方法来实现第五周的作业当然我们都知道这样做是非常繁琐的那么有没有更简单的方案呢在这我们就可以提出方案二方案二呢是生成一个具有26个元素的列表然后将每个字母都转化成相应的索引值比如说将a转化成0b转换成1然后我们来了一个字母之后就可以找到其对应的索引值然后呢将这个索引值对应的元素加一就相当于这个字母出现了一次当所有的循环结束之后我们就可以统计每个字母出现的个数下面我们就可以变成实际的实现一下好比如说我们有个字符串s它的值呢是这样的一些字母然后我们就可以生成一个列表list他呢是由26个零组成的但是生成的方法是这样零然后乘以26这样就生成了一个有26个零组成的列表接着呢对s进行循环下面呢我们就可以将每个i转化成其对应的下标那么如何转化呢Python中提供了如下的函数叫做ord这个函数呢可以将一个字母转化成其对应的阿斯克表中的数字在这呢我们可以实验一下比如说ord然后将字母a看一下它会转化成什么呢结果就是97而b呢结果就是98由此可见如果我们将这个数字减去97那么就可以是一个字母它对应的上面列表中它相应的下标值了好有了这个值之后我们可以将它作为索引那么作为谁的索引呢可以作为list索引然后再将相应的值加一最终我们可以print list好执行一下这个程序这就是最终的结果通过这个结果我们就可以看到字母a出现了两次字母b出现零次字母c出现零次而字母d呢也出现两次当然可以查一下a在这儿出现一次在这儿出现一次确实出现了两次那么有没有更简单的方案呢这节课我们介绍的是字典我们当然可以用字典来实现而在字典中谁是键呢其实我们可以用字母作为键而每个字母对应出现的次数呢作为值所以说程序就可以写成如下的样子好首先我们生成一个字典比如说叫做d字典呢首先是一个空字典没有任何的内容接着仍然对s进行循环for i ins然后我们将d[i]这个字母它对应的值加一最终我们print一下d看一下它的输出结果我们执行一下这个程序唉这个程序呢出错为什么会出错呢那我们就可以一次的来执行一下这个程序当循环第一次执行的时候i的值呢为a由于这个字典是空的d[i]呢并没有对应的值通过刚才的介绍我们知道如果字典中没有对应的键那么程序呢就会抛出异常这也就是为什么程序会出错的原因那如何来解决这个问题呢我们首先要进行一个判断也就是说如果iin d那么才执行下面的操作else也就是说i并没有在d里面就需要创建一个新的键值对即d[i]它的值呢为一也就是i出现了一次后面呢如果它再出现的话就可以对它进行加一了那么再执行下这个程序好这个就是输出的结果我们通过这个结果呢可以看到字母a出现了两次字母d出现两次字母f出现两次以此类推和刚才输出的结果呢就是一致的当然用字典的实现方式这个程序呢会更简单更直观[此为课程内容大纲,相关资源下载地址请在论坛搜索标题名称]

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|学习资源网 ( 粤ICP备16100991号-2 )

GMT+8, 12-5 07:01 , Processed in 0.155857 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc. Template By ¡¾Î´À´¿Æ¼¼¡¿¡¾ www.wekei.cn ¡¿

快速回复 返回顶部 返回列表