收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17

第十二章 列表与字典

列表(list)与字典(dictionary)都是集合。其中,列表非常有用,很多程序中都用到了列表,比如说后面几章探讨到图形和游戏编程的时候,就会大量地使用到列表。这一章包含的信息点很多,值得仔细学习。

12.1 什么是列表

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第1张图片
在 python中添加列表的格式
输出效果

需要注意的是:

(1)列表中的单个元素叫做“项(item)”

(2)使用逗号分割项

12.2 创建列表

创建一个空列表:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第2张图片

12.3 向列表增加元素

用append()这个函数向列表增加元素:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第3张图片
append是跟在列表名称后用的

注意,向列表添加元素之前,一定要先创建列表(不然不知append到哪儿去)。

12.4 这个点是什么?

为什么friends和append中间要有一个点呢?

一开始我以为只是简单的用点分割,但其实这里涉及到了更深一层的知识点:对象。

Python中很多东西都是对象(object),想用对象做某些东西,就要使用下面的格式:

对象名(变量名) + . + 对象的动作

因此上面追加元素的操作,格式就是:

friends + . + append(something)

12.5 列表可以包含任何内容

一个列表可以包含很多种不同的类型:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第4张图片
可以看到列表的元素,可以是另一个列表

12.6 从列表获取元素

我们可以使用索引号获取列表的某个元素,格式如下:

print 列表名[项数]

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第5张图片

需要注意的是:

(1)列表的第一项是[0]

(2)如果要求打印超过范围的项数,则会报错。

小疑问:为什么从“0”开始?

二进制计数是从0开始算起的,所以为了不浪费、最高效地利用比特位,内存位置和列表索引都是从0开始的。

索引是?

索引(index)表示某个东西的位置。在Python中,假如你在列表中排第四位,你的索引就是“3”,因为Python的列表索引是从0开始的。

12.7 列表“分片”

上面使用索引号可以获取一个元素。假如我们需要很多个元素,应该用什么呢?

很简单,将索引号变一下:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第6张图片

这种[首项:末项]的格式,我们成为分片(slicing)。

注意:

(1)分片有点类似于for循环中的range函数,也是要注意首项、末项的表达,以免出现bug。

(2)分片实质上是创建一个通常比原列表小的列表。所以,分片是原列表的部分副本(copy)。

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第7张图片
可以发现,print单个元素的时候是字符串,print分片的时候则成为了列表

(3)分片可以简写,即使你觉得你不是个偷懒的人,也需要看懂别人的简写:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第8张图片

其中上面是简写开头(直到序列2),下面是简写末尾(从序列2开始到末尾)。

假如没有放入任何数,只是print my_list[:],得到的是整个列表:

(4)因为分片本质是创造副本,所以当我们需要对列表进行操作,却不想影响列表本身的时候,分片就显得很重要了。

12.8 修改元素

可以使用索引来修改某个元素:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第9张图片

12.9 向列表增加元素的其它方法

一共有三种方法增加列表的元素:

(1)append():向末尾增加一个元素

(2)extend():向末尾增加多个元素

需要注意这里extend里面用了方括号,所有的项都会加到末尾

(3)insert():向列表中的某个位置增加一个元素:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第10张图片
insert要先声明加在序列哪里,然后再加上要加的项,此后每一个项都向后移

注意到insert() 加了方括号,下面的列表也是显示第三项是一个列表;但extend() 使用了方括号,在末尾加上的却不是列表。(append() 也是跟insert() 一样,这里没试)

12.10 从列表中删除元素

有三种方法删除列表中的元素:

(1)使用remove(),选中要删除的元素,直接丢掉(不用管位置):

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第11张图片
但是删除的元素不在列表中的话会报错,以后会学到元素是否在列表中

(2)使用del,删除特定位置上的元素:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第12张图片
第4个元素z,处于序列3,被删掉了

(3)使用pop(),取出最后一个元素,可以留作他用:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第13张图片
注意这里要给pop出来的字母创造一个变量名,“安一个家”

另外pop()函数里面可以填上索引号,选择特定的元素弹出来;假如没有这个索引号,就会默认弹出最后一个元素。

12.11 搜索列表

假如列表中有多个元素,怎么去查找元素呢?通常我们会这样做:

(1)查找列表中是否有这个元素➡️in关键字

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第14张图片
in关键字用在if语句中,测定有无元素
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第15张图片
改动一下原列表
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第16张图片
两次运行的结果

另外,可以在交互模式中,使用in关键词查询元素的存在状态:

也可以使用if语句和in关键词,将存在的元素删除:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第17张图片
假如有b,则将b删除,所以print出来的列表不包含b

(2)查找元素在列表中哪个位置➡️查找索引index()

索引index的意思是,显示要寻找的元素在列表中的索引位置,如:

结果显示为3

12.12 循环处理列表

现在我们将之前所学的循环,与列表知识糅合一下。例如,要使上面的letters列表打竖显示(也就是一行显示一个字母),而不是打横显示,我们可以这样做:

注意这里letter是变量名,letters是之前的列表名
每个循环都会新开一行~

对这个循环更科学一点(也更啰嗦一点)的解释是:循环会迭代处理列表中的所有值,每次迭代时,当前元素会存储在变量letter中,然后显示出来。

12.13 列表排序

前面我们学的插入、删除元素等操作,都是会改变列表顺序的。我们有时候不想改变列表的顺序,也就是希望插入元素之后,还是按照一定顺序排列好,这时候我们需要用到sort()方法。下面的例子是乱序的五个字母,我们用sort()将它排好:

说到xx方法,是跟在列表名后面直接用的,这个要记住~
排序结果

需要注意的是,用了sort方法,本身letters这个列表会被修改;并且sort是按照从小到大的顺序排的。那么问题来了,如何按照逆顺序排序?

逆顺序排序

两种思路:

(1)用sort方法按照从小到大排序,然后用逆置(reverse)功能

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第18张图片
代码增加了reverse方法
运行结果

(2)直接在sort方法中设置参数:sort(reverse = True) ,图略。

建立副本

以下面排名字顺序的例子为例:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第19张图片
排序时注意备份~
注意到是按照首字母的顺序排序

注意到复制列表时,[ : ]不可以丢,否则就不是备份,original本身也会被改变。

另外,[ : ]只是众多解决方式的一个,还有其它方法,比如下面这个~

另一种排序方法——sorted()

sorted()相当于自动帮我们完成了备份与排序的操作:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第20张图片

12.14 可改变和不可改变

在Python中,数字和字符串是不可改变的(immutable),而列表是可以改变的(mutable)。

当我们希望列表永远不变的时候,可以设置一个元组:一旦被设定之后,它不能再重新排序,更不能增删。

元组的格式如下:

列表名_tuple = ("...", "...", ...)

注意到元祖在列表名后加上了类型标志“_tuple”,另外使用的是圆括号,而不是方括号。

12.15 双重列表:数据表

有时候,单独使用一条列表的情况并不多,更多时候我们将很多列表叠加在一起使用——想象一下,表格是什么样子的?

列表也好,表格也好,我们给它们一个名称——数据结构。数据结构就是程序利用数据的组织方式,它的作用是什么呢?打个可能不是很恰当的比方,它就像你到图书馆,根据图书馆的“数据结构”,找出你要的那本书。

下面是一个简单的数据结构,

joeMarks等三个列表,是三个学生的成绩;

classMarks也是一个列表,它包含了三个子列表。

这样“嵌套”的表格,我们称为双重列表(list of list)。

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第21张图片
但这样好像不太好看……

现在我们来处理一下列表:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第22张图片
使用for循环,处理一下数据结构的格式
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第23张图片
这样看起来清爽多了!

从双重列表中获取一个值

获取一个值,还不简单?——假如在一个列表中,的确简单。但是在双重列表中,就不一样了。比如,我想知道joe的第三个成绩,按照之前的方法会是:

我们不需要的也出来了

这时候,我们在索引中添加多一个项:

这样就出来啦~

12.16 字典

相当于“电话簿”,姓名相当于键(key),电话号码相当于值(value),每一项称为项(item)或条目(entry)。

注意字典的格式,使用花括号

字典添加条目时不用append(),而是像上面的格式一样,直接加就行了。

字典与列表的相似与不同之处

相似点:

(1)条目都可以是任意的类型(但字典特殊一点,它不能用可变类型当作键)

(2)都可以在集合中查找条目

不同点:

(1)列表是有顺序(order)的,而字典则是无序的(它没有先来后到这个概念)。所以我们向字典添加内容后,打印出来的顺序可能跟原字典不同。

(2)列表使用索引访问项目,字典则利用来访问。

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第24张图片
上面是索引,下面是键名

另外,在字典中,keys()方法会列出字典中所有的键,values()方法会列出所有的值。

需要注意的是,虽然字典一开始默认是无序的,我们还是可以用sorted()函数,对它进行排序:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第25张图片
这个例子是以“键”,也就是姓名为排序基准的

假如我们不想以姓名为排序基准,可以这样操作:


收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第26张图片

现在我们最后补充一些其他功能:

(1)使用del删除字典的一个条目

(2)使用clear()功能,清除字典所有条目

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第27张图片

(3)使用in判断某键在字典中是否存在:

好了,到这里,我们的学习可以现暂告一段落了。

字典在Python中应用广泛,现在学的虽然不是全部的内容,但我们至少对列表和字典,有了基础的、大致的了解。在以后的学习中,继续加油吧!


你学到了什么?

(1)列表是什么

(2)如何向列表中增删元素

(3)如何确定列表是否包含某个值

(4)如何对列表排序

(5)如何建立列表的副本

(6)什么是元组、如何建立(提醒:使用_tuple)

(7)双重列表

(8)Python字典


练习题

(1)写一个程序,让用户提供5个名字,程序要将这五个名字保存到一个列表中,并按顺序打印出来:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第28张图片
程序代码
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第29张图片
运行结果

(2)修改第一题的程序,要求不仅显示原来的列表,还需要显示排序后的列表:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第30张图片
只需在后面加sorted方法,然后将排序后的列表打印出来便可
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第31张图片
运行结果

(3)修改第一题的顺序,要求只打印出第三位的名字:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第32张图片
又到了喜闻乐见的bug环节:我将查看位置的index用在这里了
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第33张图片
其实直接用索引搜索就可以~
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第34张图片
运行结果

(4)修改第一题的程序,让用户替换其中一个名字。用户可以选择要替换的名字,然后键入新名字,并将最终结果打印出来:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第35张图片
注意索引这里跟自然输入的差值
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第36张图片
运行结果

(5)编写一个字典程序,让用户可以添加单词和定义,然后可以查找这些单词。并且要确保当单词不存在时,用户能够知晓:

一开始做这题的时候整个人都懵了,不知从何入手。后来看了题目范例,决定先从三个情况入手:

收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第37张图片
写出了if和elif的框架,其实问题也就清晰了许多
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第38张图片
接下来一步步完善每个if情况的代码,这里是添加词组的情况
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第39张图片
最后完善查询词组的代码,包含报错部分
收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17_第40张图片
运行结果

小结

从上一章循环,到这一章列表,前前后后花了近两周的时间。除去外出因素,更多的是因为列表与字典本身的概念、应用,以及一些细碎的知识,需要时间去消化和理解。

当我坐在电脑前,一个一个字母地敲着代码的时候,不禁会想起:十几年前我也是学生,一点点地学习着未知的时候,那种彷徨、无助,却又不肯放弃的感觉。

可以说,的Python笔记不仅是记录我的学习,也是记录我在学习过程中,将自己的位置重新放在学生处,设身处地重新思考教育,思考“这个到时候该怎么教学生”的过程。继续珍惜这段宝贵的学习时间吧~

你可能感兴趣的:(收集起来——列表与字典 父与子的编程之旅 学习笔记(10)2018-07-17)