第4关:收纳的艺术--列表和字典
![](https://img.haomeiwen.com/i15162955/f7da583076c5846a.png)
嗨,很高兴能在第四关遇见你,继续和你一起驰骋在广阔的编程世界里。
当你选择来到第四关,有两件事是不言而喻的。
第一:你是对自己有盼望有要求的,你希望能够真正地掌握Python。
第二:你对我和我们团队是有信心的,你认可了“我能教会你Python”这件事。
基于此,我们之间就达成了某种“契约”关系,你付出一定的时间精力成本,我则负责让你能高效快速入门、上手直至精通Python。
这是我对你许下的承诺,更是我对自己的承诺。无论这是你第1次还是第10次立下的flag:我一定要学会Python,我希望对你而言都会是最后一次。
正所谓少壮不努力,老大转锦鲤。
让我们一起把旗子给拔了吧。:)
话不多说,我们开始正式学习。
首先,来看看我们在第0-3关所学的内容。
![](https://img.haomeiwen.com/i15162955/f2355a4eb5de69f5.png)
相信你应该还记忆犹新,学得不赖吧?否则应该是没勇气继续挑战了哈哈~
从第4关开始,我们会利用代码来实现更多的功能,我们先来扫一眼接下来的课程表:
![](https://img.haomeiwen.com/i15162955/227353829e6f5cba.png)
剩下的16关,除了常规的8个知识关卡,我还设置了3个思维关卡,5个项目实操关卡。
知识关卡的目的是学习Python的基础知识,思维关卡的目的是为你补充一些必要的编程思维知识,实操关卡的目的是手把手带你做出一些编程项目。(我会在具体关卡中再介绍)
随着学习深度的增加,我们的学习难度和理解成本势必也会增加。不过不要担心,我希望这三种类型的关卡能互相结合,可以让你在学完整个课程后,拥有扎实的基本功底。
好了,相信你对整个课程的安排已经有了个大概的认知,现在我们回到这一关的学习任务。
截至目前,我们已经掌握了3种数据类型:整数、浮点数、字符串。这一关我们就要学习两种新的数据类型:列表、字典。
不过在这之前,我想先和你聊一聊“计算机”与“数据”之间水乳交融的关系。
计算机名字里就有【计算】两字,如果计算机离开了数据,就如巧妇难为无米之炊。所以说,数据对于计算机很重要。
总的来说,计算机有3种方式利用数据:
![](https://img.haomeiwen.com/i15162955/d77766c54e01f90a.png)
第一种:直接使用数据,比如print()语句,可以直接把我们提供的数据打印出来,通常所见即所得。
![](https://img.haomeiwen.com/i15162955/7c3d5d484d916c97.png)
第二种:计算和加工数据,让我们看个例子:
![](https://img.haomeiwen.com/i15162955/8611db3b9121ee07.png)
这两个print语句,计算机都是先【计算和加工数据】,再把print()括号里的数据打印到屏幕里。
我们再看看第三种:用数据做判断是怎么一回事。
![](https://img.haomeiwen.com/i15162955/c40a2e6a85c290b2.png)
可以看出,计算机在这里是【利用数据用做逻辑判断】:
![](https://img.haomeiwen.com/i15162955/3fa796c70b8ca3d1.png)
那现在我们对【计算机】和【数据】的关系有了一定的了解吧,也正因为数据的重要性,所以对于编程新手来说,掌握主要的数据类型是重中之重。
这一关,我们就会接触两种新的数据类型——列表和字典,你会发现,它们比我们学过的“整数、浮点数、字符串”更加高级,更有“包容性”。
为什么这么说呢?前面学的几种类型,每次赋值只能保存一条数据。如果我们需要使用很多数据的时候,就会很不方便。
而列表和字典的作用,就是可以帮我们存储大量数据,让计算机去读取和操作。
列表
![](https://img.haomeiwen.com/i15162955/b206957247ab3ff2.png)
首先我们来看看列表。为了感受列表的作用,我们来玩玩角色扮演的游戏:
从现在起,你就是一个新班级的班主任了!
第一天,班上来了50个新鲜的面孔。你让学生把名字写在花名册上,方便上课时一个个点名。
如果只能用已学的知识来解决这个问题,我们需要将每个学生的名字都赋值到一个变量名,然后再分别打印。代码是这样的:
![](https://img.haomeiwen.com/i15162955/979139d12f716a1f.png)
但我们知道,在编程世界里,最忌讳的就是“重复性劳动”。这一百行代码打下来,即使是复制粘贴修改的,分分钟也要抓狂。
实际上呢,只要学会了列表和循环(剧透:循环下一关会讲,可先忽略),3行代码就能搞定。
![](https://img.haomeiwen.com/i15162955/0d3b0c360c87555d.png)
发现了吗?在第一行代码里,赋值号右边不再像字符串那样只能放一个名字,而是放了50个。
这就是我们要新认识的第一个数据类型——列表,下面我会从4个方面来介绍列表的用法。
什么是列表
![](https://img.haomeiwen.com/i15162955/635a18038b1f0e8a.png)
首先,我们来看看列表(list)的代码格式:
![](https://img.haomeiwen.com/i15162955/194f9d7cb37c1c8c.png)
图中的['小明','小红','小刚']就是一个列表。
一个列表需要用中括号[ ]把里面的各种数据框起来,里面的每一个数据叫作“元素”。每个元素之间都要用英文逗号隔开。
这就是列表的标准格式,现在请你创建一个列表名为list1的列表,列表里有三个元素:'小明'、18、1.70,并将其打印出来:
![](https://img.haomeiwen.com/i15162955/5c8c9f5ad80758e1.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/5f6201960d858732.png)
恭喜你,成功掌握了列表的规范写法以及打印列表的方法。而且,你也用代码验证了一个知识点:列表很包容,各种类型的数据(整数/浮点数/字符串)无所不能包。
![](https://img.haomeiwen.com/i15162955/246f3915fbe3a517.png)
不过,很多时候,我们只需要用到列表中的某一个元素,好比老师上课点名时,不会说“所有的同学都站起来回答一下这个问题”。
所以,问题来了:列表中具体的某个元素,要如何取出来?
从列表提取单个元素
![](https://img.haomeiwen.com/i15162955/c0ccf5778e15ecfe.png)
这就涉及到一个新的知识点:偏移量。列表中的各个元素,好比教室里的某排学生那样,是有序地排列的,也就是说,每个元素都有自己的位置编号(即偏移量)。
![](https://img.haomeiwen.com/i15162955/885bd16b4921fda2.png)
从上图可得:1.偏移量是从0开始的,而非我们习惯的从1开始;2.列表名后加带偏移量的中括号,就能取到相应位置的元素。
所以,我们可以通过偏移量来对列表进行索引(可理解为搜索定位),读取我们所需的元素。
假如你现在要喊小明来回答问题,用代码怎么写呢?请补充下列代码,利用列表的偏移量来打印出'小明'这个元素。
![](https://img.haomeiwen.com/i15162955/68419f16bfa76af8.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/a3018c7be83b6961.png)
现在我们已经知道了如何从列表中取出一个元素,那如果要同时取好几个呢?所以我们接着学习如何从列表中取出多个元素。
从列表提取多个元素
![](https://img.haomeiwen.com/i15162955/6c73f9016353d0dc.png)
这次,老师不会直接告诉你需要用到的知识,而是想让你自己总结出规律。
请运行以下代码,对比代码和终端最后的结果,尝试发现当中的规律。老师过会儿会考考你。
一个提醒:
下列:左右两边的数字指的是列表中元素的偏移量,记住偏移量(索引)始终是从0开始的。
![](https://img.haomeiwen.com/i15162955/405a90bd234eb766.png)
上面这种用冒号来截取列表元素的操作叫作切片,顾名思义,就是将列表的某个片段拿出来处理。这种切片的方式可以让我们从列表中取出多个元素。
![](https://img.haomeiwen.com/i15162955/cff13fd6a3dd1fc9.png)
![](https://img.haomeiwen.com/i15162955/32c4986e03378bfb.png)
答对了!
前半句:
冒号左边空,就要从偏移量为0的元素开始取;
右边空,就要取到列表的最后一个元素。
后半句:
冒号左边数字对应的元素要拿,右边的不动(可再回顾下代码)。
列表切片口诀是:
左右空,取到头
左要取,右不取
现在就请你来试验一下吧,请修改代码,用切片将列表中小明和小红两个元素一起取出来。
![](https://img.haomeiwen.com/i15162955/b201b5893366d682.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/d8e3146a3eefd659.png)
另外,我们要注意一个细节:偏移量取到的是列表中的元素,而切片则是截取了列表的某部分,所以还是列表,请你运行下列代码看一看。
![](https://img.haomeiwen.com/i15162955/58ae3443dff7b474.png)
![](https://img.haomeiwen.com/i15162955/4883554553477149.png)
学完了如何取出列表中的元素,我们接着往下看。
给列表增加/删除元素
![](https://img.haomeiwen.com/i15162955/a0f554bf4f973074.png)
过了一周,你正上着课呢,教导主任突然领了一个新学生“小美”,说是转校生,要插到你们班。这时,我们就需要用到append()函数给列表增加元素,append的意思是附加,增补。
我们还是通过代码来试验一番,请你运行代码,并思考规律:(注:报错后,可读一下报错信息,然后在第6行开头加个#号,将其注释掉再运行)
![](https://img.haomeiwen.com/i15162955/185bdc76dbbf9a57.png)
你发现规律了吗?我们来解读一下报错信息和代码的结果:
![](https://img.haomeiwen.com/i15162955/98b5dca455ff60a8.png)
这句话的意思是:append后的括号里只能接受一个参数,但却给了两个,也就是4和5。所以,用append()给列表增加元素,每次只能增加一个元素。
![](https://img.haomeiwen.com/i15162955/2f388a62d251b175.png)
答案是D,append函数并不生成一个新列表,而是让列表末尾新增一个元素。而且,列表长度可变,理论容量无限,所以支持任意的嵌套。
现在,请你把小美加入students列表中,并打印出列表,注意格式是列表名.append( ):
![](https://img.haomeiwen.com/i15162955/5e6592b06f8ad9b3.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/5dafde92abd8c05b.png)
很棒哟~现在你已经知道如何增添列表中的元素了。
又是新的一天,你接到一个电话,小红生病请假了,今天不来上课。所以,你要将小红从列表中删除。
提示:需要用到del语句。请你先读一下Python官方文档对“del语句”的解释:(懂得阅读官方文档也是编程学习中一个重要能力)
![](https://img.haomeiwen.com/i15162955/83afcc555c16e387.png)
请你根据上图中的知识,补全下面的代码,将'小红'从列表中删除,并打印出来:(语法是:del 列表名[元素的索引])
![](https://img.haomeiwen.com/i15162955/1e3e5e60a3f551fa.png)
事实上del语句非常方便,既能删除一个元素,也能一次删除多个元素(原理和切片类似,左取右不取)
至此,我们对列表的基本概况已经摸了个遍,是时候总结一下了:
![](https://img.haomeiwen.com/i15162955/965ff1b7a49869df.png)
掌握了这些,列表这种数据类型,你就算入门了。后续就是在练习和项目中不断积累经验,活用列表。接下来我们就来学习另外一种数据类型。
数据类型:字典
![](https://img.haomeiwen.com/i15162955/be081600a58ab693.png)
众所周知,一个老师的日常就是出卷、改卷。这次期中考呢,小明、小红、小刚分别考了95、90和90分。
假如我们还用列表来装数据的话,我们需要新创建一个列表来专门放分数,而且要保证和姓名的顺序是一致的,很麻烦。
所以类似这种名字和数值(如分数、身高、体重等)两种数据存在一一对应的情况,用第二种数据类型——“字典”(dictionary)来存储会更方便。
什么是字典
![](https://img.haomeiwen.com/i15162955/ee2a3f15ae94edfe.png)
同样的,我们先来看一下字典是长怎么样的:
![](https://img.haomeiwen.com/i15162955/db8699f74ef1fa1e.png)
仔细看下,字典和列表有3个地方是一样的:
1.有名称;
2.要用=赋值;
3.用逗号作为元素间的分隔符。
而不一样的有两处:1.列表外层用的是中括号[ ],字典的外层是大括号{ };
![](https://img.haomeiwen.com/i15162955/c55c2f4d17ad528e.png)
列表中的元素是自成一体的,而字典的元素是由一个个键值对构成的,用英文冒号连接。如'小明':95,其中我们把'小明'叫键(key),95叫值(value)。
这样唯一的键和对应的值形成的组合,我们就叫做【键值对】,上述字典就有3个【键值对】:'小明':95、'小红':90、'小刚':90。
如果不想口算,我们可以用len()函数来得出一个列表或者字典的长度(元素个数),括号里放列表或字典名称。
![](https://img.haomeiwen.com/i15162955/7519664e96e7a02c.png)
这里需要强调的是,字典中的键具备唯一性,而值可重复。也就是说字典里不能同时包含两个“小明”的键,但却可以同时有两个同为“90”的值。
![](https://img.haomeiwen.com/i15162955/152abc02a846298b.png)
现在,我们尝试将小明的成绩从字典里打印出来。这就涉及到字典的索引,和列表通过偏移量来索引不同,字典靠的是键。
![](https://img.haomeiwen.com/i15162955/aea4a0fcad786daf.png)
这便是从字典中提取对应的值的用法。和列表相似的是要用[ ],不过因为字典没有偏移量,所以在中括号中应该写键的名称,即字典名[字典的键]。
现在请你将小红的成绩也打印出来吧,亲手打打代码,才能快速掌握。
![](https://img.haomeiwen.com/i15162955/7b7e8842a7873646.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/435332ee934b9543.png)
现在你也知道如何取出字典里的值了。
小刚拿到试卷后,下课后来找你,说把他总分算错了,应该是92分。你看了一下,发现还真的是。于是,你在成绩册上将90划掉,改成了92。
这个操作在代码里对应的是字典的删除和增加。
给字典增加/删除元素
![](https://img.haomeiwen.com/i15162955/08b01fe567a2caac.png)
我们还是先来看一个例子,运行下面的代码,留意字典怎么删除以及新增键值对:
![](https://img.haomeiwen.com/i15162955/832045aae4c7ab97.png)
我们可以发现:删除字典里键值对的代码是del语句del 字典名[键],而新增键值对要用到赋值语句,字典名[键]=值。
那么,请你把小刚的成绩改成92分吧。对了,新来的小美也考了,得了85。请你对字典里进行修改和新增,然后将整个字典都打印出来。
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/2a165a48f37ac79f.png)
好了。至此,我们可以总结一下字典的基础知识:
![](https://img.haomeiwen.com/i15162955/478b40141fba1ce1.png)
列表和字典的异同
![](https://img.haomeiwen.com/i15162955/5c90f81128754daf.png)
列表和字典同作为Python里能存储多条数据的数据类型,有许多共同点,也有值得我们注意的不同点,那么接下来我们先来看看不同点。
列表和字典的不同点
一个很重要的不同点是列表中的元素是有自己明确的“位置”的,所以即使看似相同的元素,只要在列表所处的位置不同,它们就是两个不同的列表。我们来看看代码:
![](https://img.haomeiwen.com/i15162955/5374b4a96acbcc57.png)
而字典相比起来就显得随和很多,调动顺序也不影响。因为列表中的数据是有序排列的,而字典中的数据是随机排列的。
这也是为什么两者数据读取方法会不同的原因:列表有序,要用偏移量定位;字典无序,便通过唯一的键来取值。
列表和字典的相同点:
我们先来看第一个共同点:在列表和字典中,如果要修改元素,都可用赋值语句来完成。看一下代码:
![](https://img.haomeiwen.com/i15162955/4edf2e9a52cb68b8.png)
所以,上面修改小刚成绩的时候,其实直接用赋值语句即可,del语句通常是用来删除确定不需要的键值对。
![](https://img.haomeiwen.com/i15162955/5bb20f21df712043.png)
第二个共同点其实之前已经略有提及,即支持任意嵌套。除之前学过的数据类型外,列表可嵌套其他列表和字典,字典也可嵌套其他字典和列表。
先来看看第一种情况:列表嵌套列表。你在班级里成立了以四人为单位的学习小组。这时,列表的形式可以写成:
![](https://img.haomeiwen.com/i15162955/f01081a17af6308f.png)
students这个列表是由两个子列表组成的,现在有个问题是:我们要怎么把小芳取出来呢?
可能你数着小芳是列表的第7个元素(从0开始),所以想students[7]不就能取到小芳吗?
事情当然没有那么简单,当我们在提取这种多级嵌套的列表/字典时,要一层一层地取出来,就像剥洋葱一样:
![](https://img.haomeiwen.com/i15162955/23744fb0758c93aa.png)
现在,我们确定了小芳是在students[1]的列表里,继续往下看。
![](https://img.haomeiwen.com/i15162955/a04b8174b3ebeef2.png)
小芳是students[1]列表里的第三个元素,所以要取出小芳,代码可以这么写:
![](https://img.haomeiwen.com/i15162955/4e56df358a93ce78.png)
现在,发挥你的聪明才智,从列表中取出小兰,并打印出来吧。
![](https://img.haomeiwen.com/i15162955/cf547a36a053c76c.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/30b63e0d43796581.png)
接下来,我们再来看看第二种情况:字典嵌套字典。
和列表嵌套列表也是类似的,需要一层一层取出来,比如说要取出小芳的成绩,代码是这样写:
![](https://img.haomeiwen.com/i15162955/e594ce2007a847ad.png)
请你仔细观察上面的代码,然后尝试取出小刚的成绩。
![](https://img.haomeiwen.com/i15162955/7ba67e5276de1bbd.png)
真棒,给你100分都不怕你骄傲!
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/a52a7cea3a34cd57.png)
我们再来提高下难度,看看列表和字典相互嵌套的情况,可以将代码和注释结合起来看。
![](https://img.haomeiwen.com/i15162955/ce60619971c5e097.png)
同样,现在请你自己试验一下吧,请在下列代码基础上 1.打印出字典students里的小刚 2.打印出列表scores里小刚的分数100。
![](https://img.haomeiwen.com/i15162955/6f2cd59f57d34c1a.png)
老师的答案是这样子的:
![](https://img.haomeiwen.com/i15162955/26a08d3471f1189e.png)
相信你能成功做出来吧?为你鼓掌!祝贺你,对这两位新朋友的认识又更进一步。
那么,这一关的任务已经圆满完成啦。记得多复习,课后练习也要去做,能帮助你更好更快地巩固所学知识。
下一关,我们会开始接触Python里非常重要的工具——循环,有了它,许多重复性工作就可以让计算机帮我们完成。下一关见!
![](https://img.haomeiwen.com/i15162955/900e5a585bde55c2.png)
![](https://img.haomeiwen.com/i15162955/bd92809266c3a4a2.png)
![](https://img.haomeiwen.com/i15162955/17abc8a41b23ee21.png)
第一步
![](https://img.haomeiwen.com/i15162955/3ab26bb47646c229.png)
第二步
![](https://img.haomeiwen.com/i15162955/e69c44af6a9f2fd9.png)
第三步
![](https://img.haomeiwen.com/i15162955/434ca30d46f25572.png)
![](https://img.haomeiwen.com/i15162955/8dcff741bceffebe.png)
练习二、找到那只狼
![](https://img.haomeiwen.com/i15162955/8991a06adbd19c5f.png)
![](https://img.haomeiwen.com/i15162955/1ec76276faf8b107.png)
![](https://img.haomeiwen.com/i15162955/ff43efb4242ed84b.png)