第十二章 列表与字典
列表(list)与字典(dictionary)都是集合。其中,列表非常有用,很多程序中都用到了列表,比如说后面几章探讨到图形和游戏编程的时候,就会大量地使用到列表。这一章包含的信息点很多,值得仔细学习。
12.1 什么是列表
需要注意的是:
(1)列表中的单个元素叫做“项(item)”
(2)使用逗号分割项
12.2 创建列表
创建一个空列表:
12.3 向列表增加元素
用append()这个函数向列表增加元素:
注意,向列表添加元素之前,一定要先创建列表(不然不知append到哪儿去)。
12.4 这个点是什么?
为什么friends和append中间要有一个点呢?
一开始我以为只是简单的用点分割,但其实这里涉及到了更深一层的知识点:对象。
Python中很多东西都是对象(object),想用对象做某些东西,就要使用下面的格式:
对象名(变量名) + . + 对象的动作
因此上面追加元素的操作,格式就是:
friends + . + append(something)
12.5 列表可以包含任何内容
一个列表可以包含很多种不同的类型:
12.6 从列表获取元素
我们可以使用索引号获取列表的某个元素,格式如下:
print 列表名[项数]
需要注意的是:
(1)列表的第一项是[0]
(2)如果要求打印超过范围的项数,则会报错。
小疑问:为什么从“0”开始?
二进制计数是从0开始算起的,所以为了不浪费、最高效地利用比特位,内存位置和列表索引都是从0开始的。
索引是?
索引(index)表示某个东西的位置。在Python中,假如你在列表中排第四位,你的索引就是“3”,因为Python的列表索引是从0开始的。
12.7 列表“分片”
上面使用索引号可以获取一个元素。假如我们需要很多个元素,应该用什么呢?
很简单,将索引号变一下:
这种[首项:末项]的格式,我们成为分片(slicing)。
注意:
(1)分片有点类似于for循环中的range函数,也是要注意首项、末项的表达,以免出现bug。
(2)分片实质上是创建一个通常比原列表小的列表。所以,分片是原列表的部分副本(copy)。
(3)分片可以简写,即使你觉得你不是个偷懒的人,也需要看懂别人的简写:
其中上面是简写开头(直到序列2),下面是简写末尾(从序列2开始到末尾)。
假如没有放入任何数,只是print my_list[:],得到的是整个列表:
(4)因为分片本质是创造副本,所以当我们需要对列表进行操作,却不想影响列表本身的时候,分片就显得很重要了。
12.8 修改元素
可以使用索引来修改某个元素:
12.9 向列表增加元素的其它方法
一共有三种方法增加列表的元素:
(1)append():向末尾增加一个元素
(2)extend():向末尾增加多个元素
(3)insert():向列表中的某个位置增加一个元素:
注意到insert() 加了方括号,下面的列表也是显示第三项是一个列表;但extend() 使用了方括号,在末尾加上的却不是列表。(append() 也是跟insert() 一样,这里没试)
12.10 从列表中删除元素
有三种方法删除列表中的元素:
(1)使用remove(),选中要删除的元素,直接丢掉(不用管位置):
(2)使用del,删除特定位置上的元素:
(3)使用pop(),取出最后一个元素,可以留作他用:
另外pop()函数里面可以填上索引号,选择特定的元素弹出来;假如没有这个索引号,就会默认弹出最后一个元素。
12.11 搜索列表
假如列表中有多个元素,怎么去查找元素呢?通常我们会这样做:
(1)查找列表中是否有这个元素➡️in关键字
另外,可以在交互模式中,使用in关键词查询元素的存在状态:
也可以使用if语句和in关键词,将存在的元素删除:
(2)查找元素在列表中哪个位置➡️查找索引index()
索引index的意思是,显示要寻找的元素在列表中的索引位置,如:
12.12 循环处理列表
现在我们将之前所学的循环,与列表知识糅合一下。例如,要使上面的letters列表打竖显示(也就是一行显示一个字母),而不是打横显示,我们可以这样做:
对这个循环更科学一点(也更啰嗦一点)的解释是:循环会迭代处理列表中的所有值,每次迭代时,当前元素会存储在变量letter中,然后显示出来。
12.13 列表排序
前面我们学的插入、删除元素等操作,都是会改变列表顺序的。我们有时候不想改变列表的顺序,也就是希望插入元素之后,还是按照一定顺序排列好,这时候我们需要用到sort()方法。下面的例子是乱序的五个字母,我们用sort()将它排好:
需要注意的是,用了sort方法,本身letters这个列表会被修改;并且sort是按照从小到大的顺序排的。那么问题来了,如何按照逆顺序排序?
逆顺序排序
两种思路:
(1)用sort方法按照从小到大排序,然后用逆置(reverse)功能
(2)直接在sort方法中设置参数:sort(reverse = True) ,图略。
建立副本
以下面排名字顺序的例子为例:
注意到复制列表时,[ : ]不可以丢,否则就不是备份,original本身也会被改变。
另外,[ : ]只是众多解决方式的一个,还有其它方法,比如下面这个~
另一种排序方法——sorted()
sorted()相当于自动帮我们完成了备份与排序的操作:
12.14 可改变和不可改变
在Python中,数字和字符串是不可改变的(immutable),而列表是可以改变的(mutable)。
当我们希望列表永远不变的时候,可以设置一个元组:一旦被设定之后,它不能再重新排序,更不能增删。
元组的格式如下:
列表名_tuple = ("...", "...", ...)
注意到元祖在列表名后加上了类型标志“_tuple”,另外使用的是圆括号,而不是方括号。
12.15 双重列表:数据表
有时候,单独使用一条列表的情况并不多,更多时候我们将很多列表叠加在一起使用——想象一下,表格是什么样子的?
列表也好,表格也好,我们给它们一个名称——数据结构。数据结构就是程序利用数据的组织方式,它的作用是什么呢?打个可能不是很恰当的比方,它就像你到图书馆,根据图书馆的“数据结构”,找出你要的那本书。
下面是一个简单的数据结构,
joeMarks等三个列表,是三个学生的成绩;
classMarks也是一个列表,它包含了三个子列表。
这样“嵌套”的表格,我们称为双重列表(list of list)。
现在我们来处理一下列表:
从双重列表中获取一个值
获取一个值,还不简单?——假如在一个列表中,的确简单。但是在双重列表中,就不一样了。比如,我想知道joe的第三个成绩,按照之前的方法会是:
这时候,我们在索引中添加多一个项:
这样就出来啦~
12.16 字典
相当于“电话簿”,姓名相当于键(key),电话号码相当于值(value),每一项称为项(item)或条目(entry)。
字典添加条目时不用append(),而是像上面的格式一样,直接加就行了。
字典与列表的相似与不同之处
相似点:
(1)条目都可以是任意的类型(但字典特殊一点,它不能用可变类型当作键)
(2)都可以在集合中查找条目
不同点:
(1)列表是有顺序(order)的,而字典则是无序的(它没有先来后到这个概念)。所以我们向字典添加内容后,打印出来的顺序可能跟原字典不同。
(2)列表使用索引访问项目,字典则利用键来访问。
另外,在字典中,keys()方法会列出字典中所有的键,values()方法会列出所有的值。
需要注意的是,虽然字典一开始默认是无序的,我们还是可以用sorted()函数,对它进行排序:
假如我们不想以姓名为排序基准,可以这样操作:
现在我们最后补充一些其他功能:
(1)使用del删除字典的一个条目
(2)使用clear()功能,清除字典所有条目
(3)使用in判断某键在字典中是否存在:
好了,到这里,我们的学习可以现暂告一段落了。
字典在Python中应用广泛,现在学的虽然不是全部的内容,但我们至少对列表和字典,有了基础的、大致的了解。在以后的学习中,继续加油吧!
你学到了什么?
(1)列表是什么
(2)如何向列表中增删元素
(3)如何确定列表是否包含某个值
(4)如何对列表排序
(5)如何建立列表的副本
(6)什么是元组、如何建立(提醒:使用_tuple)
(7)双重列表
(8)Python字典
练习题
(1)写一个程序,让用户提供5个名字,程序要将这五个名字保存到一个列表中,并按顺序打印出来:
(2)修改第一题的程序,要求不仅显示原来的列表,还需要显示排序后的列表:
(3)修改第一题的顺序,要求只打印出第三位的名字:
(4)修改第一题的程序,让用户替换其中一个名字。用户可以选择要替换的名字,然后键入新名字,并将最终结果打印出来:
(5)编写一个字典程序,让用户可以添加单词和定义,然后可以查找这些单词。并且要确保当单词不存在时,用户能够知晓:
一开始做这题的时候整个人都懵了,不知从何入手。后来看了题目范例,决定先从三个情况入手:
小结
从上一章循环,到这一章列表,前前后后花了近两周的时间。除去外出因素,更多的是因为列表与字典本身的概念、应用,以及一些细碎的知识,需要时间去消化和理解。
当我坐在电脑前,一个一个字母地敲着代码的时候,不禁会想起:十几年前我也是学生,一点点地学习着未知的时候,那种彷徨、无助,却又不肯放弃的感觉。
可以说,简书的Python笔记不仅是记录我的学习,也是记录我在学习过程中,将自己的位置重新放在学生处,设身处地重新思考教育,思考“这个到时候该怎么教学生”的过程。继续珍惜这段宝贵的学习时间吧~