00:00
同学们大家好,欢迎大家来到Python编程语言系列课程,这节课我们来讲解Python当中的字典,那么在这节课当中呢,我们主要来讲解字典的定义啊,这个定义呢,其实是概念,然后是字典的创建,那么字典当中数据的访问,字典当中元素的添加与修改啊,字典的元素的删除,以及字典的有序性,以及字典的应用场景,那么通过这节课的内容学习,我们要去掌握字典的使用。好,那么我们进入到教程当中来看一下。那么字典呢,和元组列表一样,它也是Python当中提供的一种容器数据类型啊,那么用于存储的数据呢?比较特殊,字典当中存储的数据是以键值对的形式啊,是以键值对的形式来进行存储的,那么俗称啊叫k value6形式,那么Python当中的字典和现实生活当中的字典一样,那么现实生活当中字典是什么样子呢?我们回想一下啊,在脑海里面去想一下。
01:08
我们在使用字典的时候,一个。这个拼音啊,一个拼音可能会对应着一片区域,这片区域当中所有的字是吧,都是属于这个拼音的啊,都是属于这个拼音的,那这其实就是一种字典的形式,那么还有就是更详细一点的,比如说我们说呃,某一个随便啊,某一本书当中它的目录,那目录当中有大纲,这个大纲当中写了我们某一章节啊,比如说我们Python编程语言当中的Python数据结构当中的字典,那这个字典呢,从哪页开始呢?它点点点点点后面,比如说108页对吧?那么这其实是一种键值对形式,前面用我们的标题,然后关联着它具体的页码,那么我需要去查看字典的时候,我通过这个大纲索引到当前的108页,之后我直接翻到108页,那就可以去找到字典内容的相关信息了,对吧?诶那这其实就是一种。
02:07
字典的结构,那么我们Python当中这种字典结构其实也是从现实生活当中的字典衍生而来的啊,衍生而来的,那么和现实生活当中这个字典类似啊,其实说就是一致,那是通过一个K啊,通过一个K,什么是K呢?就是我们大纲当中的这个目录,那么对应一个确定唯一的值,那这个确定唯一的值是什么意思?比如说字典对应了108页,那么字典就是这个K,而108页就是它唯一的值,那么。有的同学说,那它不能对应两个值吗?不可以啊,不可以,比如说就点,那你不能说既从108页开始,又从一百零八一九一百零九页开始,那这是不对的,对吧?不可能出现这种情况,我们说的是从某一页开始,哪怕说这一页只有一个标题,然后就翻页了,那他也是从当前有标题的这一页开始的,对吧?所以说你把这个页码应该只是到这一页上,那么它呢,就对应了一个绝对唯一的页码啊,一个绝对唯一的页码。
03:13
好,那么字典呢,它是无序的,注意这个无序呢,我们后面会呃讲解一个概念,它又变成有序的了,那一会儿呢,我们讲到字典有序的时候,再详细去讲啊,那字典它是无序的,为什么是无序的,这个一会儿我们在下面定义的时候,讲到K的时候啊,马上就会说那。在3.7以前啊,它是无序的,然后是可变的,是可以存储任意类型元素的这样一种数据容器类型啊,那这是字典的一个概念。那么数总简单总结一下就是字典是一种容器数据类型,它呢,用来进行存储键值对形式的元素,那么K必须是唯一的值,可以是任类任意类型的元素啊,这就是字典。那么Python当中使用花括号啊,就是一对大括号来描述字典,然后画括号当中每一个元素都是以间值对形式来精确连接的啊,间值对形式进行表示的,那K跟value之间用一个冒号连接啊,元素和元素之间呢用逗号分隔,那在这里这个K啊必须是一个可哈希对象啊,什么叫可哈希呢?其实就是一个。
04:30
哈希呢是一种算法啊,也我们在这里面程序当中呢,理解成是一个函数,那么我们把一个数值通过这个哈希函数啊,就是后面这个哈希函数,那么传出去之后,在同一次运行这个程序的时候,那么无论在这次这个程序的什么位置进行去执行,它都能得到一个唯一值,那注意它能得到一个唯一值,要注意我们的前提条件是说,当我们使用一个值来使用哈希函数进行对它哈希的时候,无论在这个程序当中的什么位置出现了多少次,那么只要是同一次运行这个程序,那么在使用哈希函数的时候,对这个值所哈希出来的结果都是唯一的一样的啊,都是一致的那。
05:22
根据这个特性啊,根据这个特性我们就实现了这种字典的key的这种实现啊,这种使用吧,那么因为它就有这个唯一性,所以说我们现在无论在程序当中在哪使用当前这个K,大家都通过哈希函数来算出一个位置,然后把这个数据存到这个位置当中,那这样的话就能保证我们能。读取正确的进行去访问啊,读取这个数据,所以说。字典当中的剑之对当中的这个K啊,比如这个剑,那他呢,必须是一个可哈希对象。那可以用哈希函数来进行去判断啊,这个数据是否是可哈希的,其实简单理解一下这个东西啊,可哈希对象其实就是一个不可变的数据,就是一个可哈希的,那如果是可变的,那这个东西它一直在变化是吧,你就不确定它这个东西到底是一个什么状态,那这种值呢,我们就认为它是一个不可哈希的数据啊,那总结一下就是说。
06:25
我们的哈希可哈希对象呢,就是一个不可变对象,那么在Python当中谁是不可变的呢?其实我们的数字啊,它是固定不变的,字符串是固定不变的,对吧,还是不可变的,然后呢,原组也是不可变的,但是习惯上啊,我们一般使用字符串类型来作为K,因为字符串是个文本,它固定不变,对吧?那么元组呢,虽然说是固定不变,但是它的复杂数据结构的时候可能也会发生变化,那么后面我们讲到深拷贝浅考贝的时候,再给大家进行去讲解这个东西啊好。
07:00
那么下面呢,我们来验证一下这个哈希这个东西啊,看看什么是可哈希的,那在这里啊,我们来进行去。验证一下这段代码,那在这里呢,我们只把这段代码直接复制过来给大家看一下就可以了,好,那么我们建立了这样一个程序,在这呢,我就直接把这个代码呢运行到这里了,好,那在这儿呢,我就调用了一下看啊在这上面啊,我们进行去调用了一些。这个print函数直接调用了print函数,然后调用了哈希函数,把这个AB它的结果呢,进行去做了一个哈希值,然后呢打印出来,然后呢,我在mahhi这个函数当中,然后也去打印了这么一句话,那这句话的作用什么呢?是说我们在程序的不同位置是吧,而且多次执行了这个对AB这个字符串的哈希过程,那么他们会得到同一个结果吗?那我们运行下看看。大家可以看到,那无论是我在程序一开始是吧,来进行去执行这个哈希函数,对AB执行哈希函数,还是说我当我调用自己的函数,然后在函数体当中进行去做哈希,那么得到的值都是3798,呃,39786开始,然后呢,39383结束,那都是同一个值,那所以说无论在我们这次程序当中啊,在运行的过程当中,无论这个哈希函数在哪,这个值只要它是不变的啊,只要它是不变的,那么它就会有一个唯一的哈希值出来,那注意这个值在下一次运行的时候可能会发生变化,看发生变化了对吧?哎,发生变化了,但是注意。
08:41
无论他怎么发生变化,在同一次程序运行过程当中,它是保持一致的,对吧?哎,它是保持一致的,那这种就是可哈希啊可哈希,那么刚才我说了字典当中的K呢,它是在同一次运行当中使用这种不可变的数据,保证它都能。
09:00
在任何位置找到同一个值,那这同一个值有什么意义呢?那比如说啊,再回到程序当中,那我们运行,那现在呢,我在第一个位置啊,我用它算出一个哈希值,就是算它,那现在呢,我把某一个数据,假设这是一个地址的话,我在内存当中找到这个地址,把这个数据存到这儿来啊存到这个地址当中去,好,那这时候我其实我就是秘密的去埋了一个点,对吧,还埋了一个数据,那把这个数据埋到这个地址当中了,好,那么无论我现在程序执行到什么情况下,我只要拿着我这个标记对吧?我记得我当时埋的时候有一个什么标记,我拿这个标记再算,又算出了当前这个位置,好了,那我是不是就直接可以找到内存当中的这个地址上进行去取值这个数据呢?对吧?哎,是的啊是的,那么无论在哪儿,下一次我还是这样,我又走了,然后回来,我说又想找这个数据,那我们又去拿着这个数据,拿着这个密码是吧?来翻译一下,那哈希其实可以理解成这种加密的过程是吧。
10:00
我们把它一顿加密啊解密,然后呢,算出来这样一个值,算出这个值之后,然后呢,我又找到这个数据了,然后我就到这个地址上把这个数据取出来,那无论在什么地方都可以实现这个过程,那在同一次运行的程序上,那么同一个值,它所哈希出来的结果一定是保持一致的,那么这种我们才认为它具有可哈希性啊,那如果算出来不一致,那对不起,你这个玩意儿就不能进确作为哈希值使用了,那比如说啊,我现在假设举个例子,还是拿我们刚才那个例子来举例,我说我拿AB算出来一个值叫1000啊,我把这个值存到1000这了,然后呢,我过了出去游历了10年20年,对吧,回来了之后呢,我想把这个埋的这个时间胶囊取出来,然后呢,我又拿着,我记得当时啊,我用这么一个值算AB算了个数据,对吧,还算了个数据,算数据找到了什么东京啊,西经啊是吧,哎,找到了一个坐标位置,那么这时候我拿这个数据再一算,哎,他告诉我。
11:00
算出2000出来了,对吧,那我到2000那去找这个值,他能找到吗?他肯定是找不到了,对吧?啊,所以说这个是不对的啊,这是不对的那吧,他可哈希呢,一定是它同一个值一定能算出同一个结果啊,这就具备可哈希性啊,那么可哈希数据呢,在这儿我们说都有哪些呢?看元组字符串啊,这是数字类型的元组,这都可以,然后你看这个啊,下面这个这是个列表,它就不具备可哈希性,而这个元组,诶,刚才的元组还具备可哈性,这个呢,不具备了呢,这元组当中包含了一个可变的列表,对吧?我们把这段代码也复制过来,我们再运行一下看看,我把这段就删了啊。好,那运行看看在这运行,你看前面这三个123ABC和元组123,它都具备可哈奇性没问题对吧?哎,没问题,那他都打印结果了,但是第4个它这输出看第12行出错是不是就是第4个,那他说呢。
12:05
Unh是吧?哎,那一个unh type list什么意思呢?就是说列表这个类型是不具备可哈西性的。为什么不具备可哈性?因为它是个可变数据类型啊,它是个可变数据类型,那里面的数据动态变化,比如说我拿着123去做了哈希,那没问题,我可以给你做哈希,做完了之后,哎,回头你一做完哈希,你马上把这个纸改了,你说我加了个4进来,那这个时候你回头拿着这个4。拿着这个4,然后到我这儿这个再算,说我要取数据,那我算出来之后一找没这个数据啊,这不有问题了对吧,这玩意儿就像当铺一样对吧,就像当铺一样,那么当铺我们拿一个宝贝到当铺里面当出来钱,然后呢,说我回头要去赎当,那你是熟的时候肯定有个标记对吧,你对物品有个标记,那这个当铺对你的这个当票也应该有一个标记,不能你随便拿这个当票,然后你回来就说我要赎档是吧,那把东西给你了。
13:05
那回头另一个人再拿着一个当票过来,那么去取这个东西,那怎么办,对吧,还你怎么办,所以说就算可变性的这种,他是不不能进行去可哈西的啊,不能进行可哈西的好,那第一个我们证明了不行,那第二个呢,第二个是它的元组,这个是个元组啊,你行我为啥不行呢?我们再运行一下看看啊,看它是不是也不行,这第13行是吧,出错了,那就是因为它在这有个列表,就是你虽然是个不可变的数据,对吧,表面上你只具备两个数字,一个列表,这是你不可变的地方,但是列表里边的东西你不可控啊,你不可控,我能不能在列表里面加个数据呢?我们在这验证一下啊,把这个数据给它注释掉,然后呢,你看我在这。我把这个元组拿出来,然后呢,我说一个T等于它啊等于它,然后我说T,哎,这是几呢?这是2对吧,T2是不是找到这个列表啊,然后呢,我在这里面点aend追加,追加个谁呢?追加个。
14:06
再去加个2吧,啊,然后呢多复制几份,然后呢,我们打印一下T,你看看我定义的时候只有1233个数据,那现在它有多少个数据了。是不是一三,然后追加了三个2对吧?追加三个二,那就说明这个列表是可变的对吧?那你说我原组没变啊,原组没变那没关系啊,我相信大家都看过亮剑打打这个平安格勒之前,对吧?啊,那个团长啊,李云龙说把这个分散到各个地方的这个部队给我整合起来,这个营长张大彪是吧,就回来之后一问说有多少人一个底下的这个营是吧?有8000人,那一个团才多少人对吧?他一个一个营。有8000人,那么也就是说我们这团的这个建制在这里面,正常的一个团是不是应该是应该应该大概多少人,假设啊,1500人左右,那他这个一个营。
15:01
就干了8000人,比一个师的人还多啊,那这其实就说明我们在这里面,你虽然外面啊,你的建职没变,你可能这一个团下面有三个营,但是你这营一个营里面就赶上别人一个师的部队了,那这个就发生变化了,对吧?啊就就说明我们这里面啊,其实是可以改变的,那他呢就不具备可哈希性了,好,那这是我们这个可哈希啊这个概念,那么也就是说总结一句话,我们在字典当中,这个K一定是要具备可哈希性的,那总结一句话就是说这个K只能是不可变对象,那什么是不可变?数字是不可变的,字符串是不可变的,原组是不可变的,而且元组当中的元素必须也是不可变类型才行,但实际大多数在使用的场景下,一般我们都会用字符串类型来精确描述,为什么呢?因为元组这个东西啊,不方便写,而数字呢,它又不具备直观特性,对吧?一二三到底是什么东西,我不具备直观的特性。
16:02
非要使用文本有意义的单词字符串,对吧?文本数据我们作为K,它才证明我们当前的这个K是有意义的,能表示知道它存储什么样的数据,好了,那说了这么多,那下面来看一下字典当中的啊,这个创建啊,如何创建字典,那我们刚才说字典呢,它使用什么呢?它使用划括号的形式来精确创建字典啊创建字典,然后。在这画括号当中,它要使用键值对的形式来描述一个元素,注意一个间值对是一个元素啊,一对才是一个元素,那么既有K又有值,K只能是。不可变的可哈希对象,而只可以是任意类型的对象都可以啊都可以啊,那这个呢,就是我们这个字典的它创建,那我们来看一下,那在这呢,我们说创建一个函数啊,在这里写上个字典,字典的使用啊,那DF写一个Di ino,然后呢,我们说字典创建。
17:13
创建,那字典创建呢,它也有两种方式,第一种是字面量形式。好,那自变量创建形式呢,在这儿我们进行去创建一个,比如说D啊D1吧,等于诶这个可以,它是个可变数据类型,那这种形式呢,是一个空字点啊这是可以的,那比如说我们去打印一下DE1,在print打印一下type de1,然后呢,我们去调用一下这个Di info这个函数,我们运行看看。走,你看这个空字典被打印出来了,然后呢,字典是Di类型啊,Dictionary对吧,哎,Di类型那说明这个是合法的啊,那么如果有数据的我们怎么写呢?第二等于哎还是一个花括号,那么注意我们在这比如说它可以保存任何类型,那name,那name,然后呢,我们等于一个这是字符串类型,我说等于Tom,然后age,注意啊1我们说了一般字符串这个K的话,一般都用字符串来表示,然后呢。
18:15
它用双引号引起来,然后冒号连接啊,冒号连接,冒号连接它的值值可以是任意类型,比如说23对吧?啊,然后呢,在这再写一个真点啊真点好,真的呢,我们写一个布尔类型吧,然后写一个true对吧啊写个true,然后再写一个po比一个爱好对吧?啊那在这呢,我们再写个这里面写个啥呢?我写个列表啊,写个列表,然后这里面写上一个,比如说呃,Eat吃喝玩乐。I eat.然后这。然后再来一个玩啊,再来个乐乐啥的,哈哈哈吧,啊哈哈哈,吃喝玩乐,那现在这个写完了之后,这就证明了它是可以去保存任意数据类型的,当然这里面可能还可以去保存元组,对吧?啊,那我们在这没写啊,那列表可以了,元组基本上也都可以,或者说我们在这我把它改成元组的,那只要元组可以的列表一定可以,对吧?哎,因为。
19:17
诶,因为列表比元左灵活性更强啊,更强好,那在这呢,我们去打印一下第二,然后呢,Print type打印下第二来看一下,那运行之后我们来看,那这个字典呢,就被打印出来了,对吧?IT是个Di类型,那这是我们字密量形式来创建字典,那除了这种形式之外,它还可以使用构造方式啊来建立创建字典,但使用构造方法创建字典的时候,相对来说比较麻烦一点。他怎么麻烦呢?它有很多种方式,第一个它可以使用这种参数形式来创建啊,使用参数形式,参数名呢,参数名啊就表示我们的T,而参数值就表示它的value,那你有多少个参数,你字典字典当中就有多少个建值,对实际上这个就映射到这里来,就是这样的,他把你的这个。
20:17
映射到这,然后把这个呢映射到这,这个映射到这,这个映射到这儿,然后这个映射到这,这个映射到这,就一个三个建筑,对对吧,哎,就是这样的一个关系,就是参数名作为它的T,而这个值呢作为它的一个。Y流啊,是这样来进行去实现的,那么还有一种形式呢,就是无论你是用列表嵌元组,还是用元组嵌元组,还是用列表嵌列表,还是这个,呃,其他这种混合的嵌入方式那都可以,那么这种方式呢,要保证的是,首先你外层得是一个容器类型啊,外层是个容器类型,然后内层呢也是容器类型,原始元组是列表无所谓,但是你这一个里边的元素只能有两个数据,一个是作为K的,一个是作为值的啊,一个是作为值的。
21:08
那这个是这样来精确实现的,你也可以通过一个字典的形式来进行创建,但这个就没有意义了,对吧?啊没有意义了,那第三个呢,这种形式就是前面用一半字典,然后再用一个参数结合的形式,这他也认啊,这他也认,那还有一种形式就是说我现在没有这种数据啊,我拿到的数据就是一组。可以作为K的数据,一组作为值的数据,那这个时候你可以用Z这个函数把它压缩一下传进去也行啊也行,那我们来一块试一下,使用构造函数啊,使用构造方法和构造方法创建字典。创意字典那第一种形式呢,比如说还是DE1啊,等于它使用参数的形式,那我们在这写一个,那比如说就写一个name啊,然后呢,等于,等于谁呢?等于一个杰克吧,这回啊杰克,然后呢,这是写个age啊等于啊等于。
22:09
等于23,然后呢,再来一个,然后再来一个真的。真的,然后呢,这写个map等于啊。好,那现在写完之后注意啊,这个这个是个英文符号啊。这里是英文符号啊好,那现在写完了之后,然后呢,我们在这去打印一下,第一。嗯。啊sorry啊,在这这个参数名啊,不能加引号,参数名是不能加引号的。啊,那现在写完了之后,参数名不能加引号啊,我们写字典写习惯了,那键值对呢,都写上引号,那这个呢,它是不能加引号的,参数名是函数的参数一部分,它是不能加引号的,值必须要,如果是字符串必须要加上引号啊,这个参数名不需要加,好我们这回再运行一下看看,那拿着你的字典构造方法创建出来的,它一定是字典对吧?啊,它一定是字典,好,那我们再来看第二个。
23:22
第二,那第二第二第二等于什么呢?第二个等于Di,然后呢,这个它接收一个容器,比如说我们接收一个列表,你这个列表里面是啥都无所谓,对吧,外面是个元组也行,但是里边的数据,哎,我们写一个这个的,然后再写一个列表的,好就写这俩吧,然后呢,这个写个啥呢?这就得用。这个字符串来引起来,用双引号引起来了,那还是我们说name,然后呢,逗号写一个Tom啊啊写个肉丝吧,啊写个肉丝好,然后呢,这个写个age,然后呢,在这逗号再写个啥呢?写个这个26好,那注意啊,在这看我们要看它的,不要看内容啊,内容无所谓,你要看它的形式,首先外层是一个元组,呃列表啊列表,然后内层呢,它有一个元组,有一个列表,对吧?哎,那也就是说通过这种形式我们可以证明它什么都可以嵌对吧?它这个类型什么都可以嵌,那么里边每一个元素都是一个容器,但这个容器当中只有两个元素啊,只有两个元素,那要保证是第一个元素,我们一般啊,那在这咱就约定一下,固定就这么说了,就必须是个字符串,因为作为它的K嘛,对吧,一般我们都用字符串来作为K,那我们在这就约定啊,约定是这么说的,就必须是个字符串对吧,还必须字符串,而后面这个值。
24:45
无所谓是啥都行对吧?啊是啥都行啊,那这个写完了之后,我们再来看一下第二啊,第二打印一下。大家看这也生成了一个字典对不对?哎,那还有一种形式什么呢?其他的啊,在这里面这几种形式大家就可以去自己在练习的时候啊,进行去自己呃操练一下啊来熟悉看看是不是能实现出字典的效果,我们最后看一下zip这种形式,那Z这种形式什么意思呢?我们第三等于一个Di啊Di然后呢,先写个括号,然后注意现在啊,我在写这个东西的时候呢,可能是有这种情况,比如说我们真正实际在数据处理的时候,可能不会有这种现成的这样的数据啊,不会有这种数据,那么我有的是什么呢?我比如说我有的一组列表啊,那比如说在这我有一组kiss啊,Kiss等于它有一组列表是这样的,比如说它是name,然后呢age,然后gender,好,然后呢,比如说address,好,它有一组这4个是吧,还有4组这样的数据,然后呢,我还有一组值,比如说values。
25:56
那在这呢,它可能是个元组啊,无所谓,然后呢,这里面它包含的数据,比如说这个是啊Tony啊to尼,然后呢在这22,然后呢,在这写个ma,然后地址是吧,北京啊北京啊,那现在我有这样两组数据,他们的数据个数都是一样的,对吧?啊数据个数都是一样的,那这个时候我想让它俩一一的关联组合,作为一个字典生成,那这个时候怎么去做,对吧?这时候怎么去做呢?你就可以把zip给它放进去,Zip把谁呢?把key和values放进去,那这个时候它就会去同时去便利这两个东西,也就是说我们现在把这两个内容呢,给它放到一起,同时去便利它俩,同时便利它俩之后依次取出对应的数据,对应位置的数据,然后呢,把它们做成建筑对的形式啊,那我们看一下第三print,第三来看看是不是这样。
26:58
你看是不?Name=Tony age=22,真点等于ma,然后address=Beijing京,那现在是不是,诶一个一个的对应上了,对吧?啊对应上了,那这个就是我们字典的构造方法创建形式啊,构造方法创建形式,但是大多数我们在用的场景下,一般都是用这个形式啊,就上来先创建一个空字点,然后慢慢往里进行去这个追加数据啊,追加数据好了,那字典创建好了之后,那下面呢,我们来看一下字典数据的访问。
27:28
刚才我们说字典它是可变数据类型啊,它是可变的,那么我们就可以来获取,然后来修改,来删除它的数据,那首先看一下访问,那注意列表呢啊,不是字典跟列表跟元组还不太一样,我们知道字符串列表,字典,呃,那个元组这三个数据类型它都是有下标的,对吧?啊,它是有下标的,它默认的下标都是从0开始,然后呢,到元素个数减1,那么中间的一数据呢,都是从0开始,依次向上递增1啊,然后来对应它们的这个位置,那这个位置值我们称之为下标是吧,也叫索引或者叫下标索引,那他们都有这种数字类型的下标索引。
28:14
但是字典啊,字典因为之前它是无序的,因为哈希出来的值,你没法确定你给的这个值到底是多少,比如说啊,我们举个例子,这三个name哈希出来的值可能是5,而A哈希出来的值可能是个2,对吧,而且这个针的呢,哈希出来的值可能是83,那这样的话,你在写的时候是按这个顺序进行去存储的,但是这个这个书写的定义的,但实际存储的时候,它得按照哈希值的结果来进行去存储,对吧,那这样的话导致了我们这个东西并没有。一个标准的连续的一个序列,那没有连续序列,我的下标就没法进行去连续增长,因为我内存当中只有连续我才能让它一次累加进行快速找到数据,而你这个没有连续性的话,那么我们就无法进行对它做数字编号这种梳理了。
29:07
那这时候怎么办呢?那这时候说那就不用这种数字形式的了,那我们刚才说了,其实K是不是能可具备可哈希的特性,那哈希出来那个值不也是一个值吗?那么既然我们都能通过哈希那个值来进行找,那你就可以把这个K作为一个索引来使用,对吧?让我们在取数据的时候,你就拿这个K来找就行了,对吧?哎,拿这个来找就行了,你别跟我说找几号数据,你就跟我说找什么数据,比如说我想找字典当中的name数据,那你拿着这个name过来,我就拿name去进行哈希,哈希完了之后找到一个位置,然后把这个位置当中存储的数据把你取出来,然后给你,对吧?就是这样,那使用方式其实和下标索引一样,它也使用字符串方式,只不过把数字下标变成了K下标啊,自定义K下标,好,那么我们来看一下,那比如说刚才我们在这儿一直都在使用它,比如说就拿这个第三啊。
30:08
来进行去使用,那么我们说打印一下第三这是打印整个字典,那么我们说打印它的一个这个address,那你就ad res对吧?哎,来访问一下,诶运行,你看它就把背京取出来了,对吧?哎,那如果说我取了一个SSS,它不存在的,这个怎么办呢?运行。他会报一个KL就是错误对吧?那一般我们在访问了一个不存在的,或者是越界的,超出范围的这样一个下标的时候,它会返回的是一个out of range,就是index out of range对吧,就是越界,而你这个呢,字典因为它没有下标,它没有界限的问题,它是随机乱序进行存储的,它没有界限,那没有界限,但是你存了一个数据,我找不到值怎么办?你拿着这个address跟addresss进行去算这个哈希值的时候,它肯定是不一个值啊,肯定不是一个值,那么这样的话,我拿这个东西一算,算完这个值到那一找,发现没有数据啊,对吧,没有数据,那没有数据怎么办?没有数据那就告诉你这K是错误的嘛,对吧,还告诉你这个K是不存在的啊,就是这样,他也会报个异常,只不过不是下个月借,而是K不存在啊,K不存在好,那这个是我们通过这个下标啊,通过这种下标的形式,通过字典的key来精确获取书。
31:30
据啊,这个获取数据定义好的数据获取一下,然后呢,我们再来看一下字典当中它这个元素的添加和修改,字典当中的这个添加和修改比较有意思啊。因为它都是用K来精确保存的,那么当我们第一次使用这个K的时候,那第一次使用这个K的时候,那么这个时候呢,他。就会去增加一个建制对,因为第一次使用这个K,这个K不存在,它就会增加一个建制对。
32:04
到字典当中去,就是像建制,像字典当中添加数据,那么如果说我们第二次再使用这个K这样去操作的话,那么因为这个K已经存在了,那么它能计算出位置了,发现里面有数据怎么办呢?你既然知道有数据,还进行做赋值操作,对吧?那就说明你现在要做的是修改,所以说它直接就会把这个数据给它修改掉对吧?修改掉那这个特性一定要了解啊,它的修改和添加是一个操作,那只是根据K的不同来进行去决定它里面到底这个是添加还是修改,那么我们根据这个特性,可以在实际应用的过程当中去做很多事情,比如说。比如说现在我要统计一下我这个这段文字当中,每一个字出现了多少次啊,每一个字出现多少次,那么比如说1这个字,你看一这个字是不是出现了很多次啊,那我现在想统计一下一出现多少次,那这个时候我就把1。
33:04
我读到一个啊,从这开始吧,我读到一个字,我就把这个字作为K,然后呢,放到字典当中去是吧?哎,然后把一个一放到这个字典里面去,然后呢,作为一个建值,对,然后呢,我下次再取一个,又放一个建值,对,等于1,再放一个等于1,那么如果说啊,我在放的时候,刚开始直接往里放就行,这都是唯一的没问题,这个也是唯一的没问题,对吧?那放到这儿的时候,你看这时候我再往里放,如果还放1的话,那就统计不准确了,那我怎么办呢?其实这个逻辑应该是我先从字典当中读一下这个K,它能不能读出值来,如果能读出读出值来对吧?哎,那我就用原来那个值加1再存进去,那如果没读出值来的话,我就给它付个一,对吧,让它存起来,那这个其实都是。这一个操作啊,都是这样的一个操作,好,那么我们来看一下啊,如何进行去操作,那首先呢,我们在这儿进行去创建一个DD吧,等于一个空字点啊等于空字点,那打印一下DD,大家可以看一下这个是空的。
34:09
对吧,还是空的没有了,好,那没有的,我们说DD在这里面,我们进行去添加一个K,那这个K呢,就叫ABC,我让它等于一个值,等于一个123123,好,然后呢,我们再次打印一下DD。那看一下。诶,这个时候是不是就追加了一个限值,对到字典当中去,对吧?啊,这是追加,那么我说我再来一次还是ABC,那这个等于11111222233333,好这么长一个数据,注意啊,这次是我们的ABC在这个DD这个字点当中去了,那我们再运行,你看这个时候字点是不是还是只有一个渐止,对只不过这个值发生了变化,对吧?哎,这个就是添加添加,而这个呢是修改啊,这个是修改啊,那么它的添加和修改都是这样一个操作啊,都是一个操作,但是这个是非常有用的啊,非常有用的。
35:11
好,然后呢,我们再来看一下删除,那字典的删除呢,跟列表当中删除元素一样,对吧?我们也可以使用D点,当然呢,还会有其他删除方式,我们会在字典操作当中再给大家去讲解,那么do键呢,可以直接删除某一个元素,那么当我们删的时候和列表当中删某个元素一样,我们找到字典,然后找到字典对应的K,然后把它删掉就可以了啊把它删掉就可以了,好,那我们就来看一下,还是在这个基础上啊,还是在这个基础上,我们刚才打印了一下,你看最后打印的时候是不是这里面有个数据,那注意啊,现在我们说deal删除,这是个公共的关键字操作,不是一个函数啊,注意,那deal删除谁呢?删除DD里面的这个ABC啊ABC,然后删完了之后,我们再打印一下DD,你看注意这个时候诶,它还是可以进行去访问的,只不过这个DD。
36:11
他现在空了对吧,哎,空了,但是要注意的是,如果你要是写成这样,那就对不起了,你说DD把它删了能不能执行呢?反正语法上我没看他报出什么问题来,对吧?啊,语法上没什么错误,那么我们运行来看。哎,报错了对吧?哎,报错了,报什么错呢?说你在赋值之前是吧,引用了本地变量DD什么意思?DD不是存在吗?这这啥意思?赋值之前引用的DD就是说这个DD现在压根不存在,是不是第41行的时候在这不存在,为啥不存在呢?前面你给删了这个时候啊,我们上节课举的例子就是说这个碗里面装了个榴莲,榴莲坏了是吧?连碗带榴莲全扔了,就是删除我们当前的变量名对吧?啊,这是全扔了,如果你想只想山里面的元素,那么怎么办?那么要带上下标或带上K啊才是山元素好,那这个呢,就是我们删除这个元素啊,删除这个元素好,那关于字典的定义,添加、修改、删除我们就讲完了,那下面看看字典当中的新特性,那刚才在开始的时候呢,我们给大家去讲了,说字典它是无序的,对吧?啊是无序的,但是在Python的3.7这个版本以后。
37:28
那么字典呢,被认为是有序的,他修改了它的特性,早期的时候我们一直就认为字典就是无序的,它也是无序的啊,它也真的就是无序的,但是后期到3.7这个版本以后,它修改了它的新的特性,就是改了这个版本还是比较大的,对吧?把它变成了有序的,它呢既可以保持建制对添加顺序啊,那就意味着我们在便利字典或打印字典的时候,建制对的这个顺序与他们添加到字典当中顺序是相同的,对吧?那么这种有序性。
38:01
是字典的内置特性,不需要我们额外的进行做操作了啊,如果不需要我去控制它怎么样怎么样,你定义的时候什么样,你取的时候也是什么样的,对吧?啊,那么在最高的早期的版本当中,字典是无序的,无法保证建制队的有序性啊,那也说里面的算法它进行做了一个优化,或者说做了一个新的更改是吧,那早期的时候它是无法保持的,那么。你在遍历字典的时候,就我们定义的时候,比如说是ABC这样的一个形式,对吧,那实际上它在这个显示的时候可能就变成了ABCD了,对吧?它的字典K的顺序变成ABCD了,这个顺序啊,注意是K的顺序啊,是K的顺序,就是你K在显示的时候,它的顺序啥样的,因为值是跟着K走的,你只有找到K你才能找到对应的值,没有K的时候是找不到值的啊。那在这儿编程当中,如果需要依赖建筑队的这个顺序,那使用3.7以上的版本,那我们在这儿现在装的都是三点十了,对吧?我们给大家去,呃介绍这个课程之初啊,安装的版本就是三点十了,那现在我这个用的最低的版本也是3.88了,所以说现在呢,我们可以就这么认为都是有序的了啊,都是有序的,那么如果你想使用旧版本的对吧,那可以考虑这个collections这个集合当中有一个order dit来实现有序字典,就是说他们默认无序吗?那你可以使用这个collection.order dit就是有序字典形式来实现这种有序功能,但是现在已经没必要了啊,现在已经没必要了,因为我们这个高版本已经默认就是有序的了,所以说这个呢,大家做个了解就可以当如果啊,大家面试是吧,学完了这个东西要去面试,用到这个东西说字典有序的无序的,那你可以跟他说3.7之前是无序的,3.7之后是有序的就可以了啊就可以了。
39:52
啊,那么我们再来看一下字典的应用场景,说这个字典有用处吗?字典的用处非常非常大啊,它可以进行去除了存储数据之外,可以用来描述我们的模型,对吧?啊,存储朽将关联性的数据,那比如说原来我们写的时候列表字典,比如说存一个Tom,然后22,然后男是吧,这东西到底是啥不知道对吧?哎,那么我们现在如果说。
40:21
想描述一些有关联性的信息,比如说用户的信息啊,学生成绩啊,员工信息啊,账号信息啊等等,对吧?啊,那这时候就可以通过一个字典的形式来进行描述,每一个值我们都加一个描述性的K,那这样的话,通过这个K我一眼呢,就能很直观的看出它的值是什么,对吧,描述是什么值,那比如说现在。我这个有一个,呃,银行卡信息啊,银行信息,银行账户信息,那它有三个100啊,有三个100,那或者三个呃三个20吧,啊三个20,那这三个20,比如说年龄是20,然后呢,你的账户余额是20,然后你的这个开户年限是吧?哎,这个这个比如说我们当年在这有个星级吧,啊有一个比如说我这个有一个用户等级,我已经熬到了20级了,那你说写你就在这儿用个数组写上二十,二十,二十,那这是什么东西啊对吧?这三个20到底谁代表谁呢?不知道对吧?那如果我们用字典来描述的话,告诉他你的这个年龄是20是吧,然后账户余额是20,然后你的这个呃等级是20级最低是吧,20不一定是高是吧,20级可能是我们这个银行的开户就是20级啊,越往上一级的,那就是一个贵宾VIP中P的贵宾客户了,对吧?啊,所以说在这儿我们可以通过这种有这个字典来进行描述。
41:43
出一个信息对吧,通过这个信息有关联性的这种信息,那让他可以在描述的时候更加明确啊,那这是字典的一个应用,那第二个呢,就是它提供了快速查找和访问数据的能力,那因为通过K可以直接去对应我们这个呃数据,所以说它不需要去便利整个字典,那么这种快速定义,快速进行这定位的这种能力呢,那么在有些数据查找的这种场景下,非常非常用,那比如说啊,现在我有10万个数据。
42:16
啊,我有十万个数据,比如说啊,就现在我们说这有这样的一个文字,加上它的一个释义啊,一个释义这个或者就是单词吧,就是我们的英译汉,汉译英这样的单词,那我现在呢,有比如说一万个单词,那对应了它的一个示例,对吧?哎,对应它的一个示例,那现在如果我想去找这个单词,它有什么意思的话,如果用列表来存储啊,如果用列表来存储,那你就得一个一个找是吧,一个一个找,找你这个单词在哪,那比如说我们的单词一般都是按这个字母顺序来进行排序的,对吧?那如果你想找个A的还好,那如果你想找个Z开头的,比如找那僵尸是吧,叫什么Z是吧?那。现在你要找个Z开头的最后一个,那你从列表最第一个元素开始,一直变量到最后才找到它,然后找到元素,这就效率很慢很慢,但是我们字典不一样,字典是通过我们的K的哈希值啊,通过哈希值来进行去访问数据的,那么它在存的时候就拿着一个哈希值存进去,比如说我们说现在找一个。
43:22
这个Python这个词,那他现在算出来之后啊,它的含义是存的时候,它一算出来,然后呢就算出来,比如说1000,那我取的时候我依然拿着Python,因为我要找就是Python这个单词,那我就直接说我是找Python,他就拿着Python进行去哈希,哈希完算出来是1000,好你就直接拿着这个1000到这个1000这个地址上进行找这个数据就可以了,非常非常对吧,相对于原组跟列表来说,字典查找数据的这个能力是非常非常快的,那么字典呢,还作为这个数据容器,有丰富的这种操作方法,可以进行去便利搜索,插入删除等等,对吧?呃,那么后面我们下节课就会讲这个字典的操作,通过这些我们可以来进行去,呃管理啊,我们相关的这种数据,一般的情况下,我们会在。
44:11
这种这个程序运行过程当中啊,对数据进行做增删改查这种管理的时候,一般我们会用字典来进行去描述这种数据啊,非常好用啊好,那这是我们字典的一个应用,那么关于字典啊,我们就。讲了这么多,那主要讲了什么内容对吧?那这讲了字典的定义啊,就是它的概念,然后字典的创建,数据的字典数据的访问,那还有字典元素的添加跟修改,那为啥在这写到了一起,就是因为添加跟修改实际上是一个操作,然后还有字典的元素删除,然后字典的有序性,从3.7以后,那么字典呢,就完全是有序的,你就定义什么样,对吧,什么顺序,它访问的时候就是什么顺序,以及我们说了一下字典的应用场景,好,那么通过这些内容啊,我们需要去掌握字典的一个使用,那下节课呢,我们会讲字典的常用操作。
45:07
那关于字典啊,在这里我们就讲这么多,我们下节课再见。
我来说两句