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

第十二章 列表与字典

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

12.1 什么是列表

在 python中添加列表的格式
输出效果

需要注意的是:

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

(2)使用逗号分割项

12.2 创建列表

创建一个空列表:

12.3 向列表增加元素

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

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)。

可以发现,print单个元素的时候是字符串,print分片的时候则成为了列表

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

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

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

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

12.8 修改元素

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

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

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

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

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

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

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

insert要先声明加在序列哪里,然后再加上要加的项,此后每一个项都向后移

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

12.10 从列表中删除元素

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

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

但是删除的元素不在列表中的话会报错,以后会学到元素是否在列表中

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

第4个元素z,处于序列3,被删掉了

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

注意这里要给pop出来的字母创造一个变量名,“安一个家”

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

12.11 搜索列表

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

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

in关键字用在if语句中,测定有无元素
改动一下原列表
两次运行的结果

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

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

假如有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)功能

代码增加了reverse方法
运行结果

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

建立副本

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

排序时注意备份~
注意到是按照首字母的顺序排序

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

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

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

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

12.14 可改变和不可改变

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

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

元组的格式如下:

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

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

12.15 双重列表:数据表

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

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

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

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

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

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

但这样好像不太好看……

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

使用for循环,处理一下数据结构的格式
这样看起来清爽多了!

从双重列表中获取一个值

获取一个值,还不简单?——假如在一个列表中,的确简单。但是在双重列表中,就不一样了。比如,我想知道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)修改第一题的程序,要求不仅显示原来的列表,还需要显示排序后的列表:

只需在后面加sorted方法,然后将排序后的列表打印出来便可
运行结果

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

又到了喜闻乐见的bug环节:我将查看位置的index用在这里了
其实直接用索引搜索就可以~
运行结果

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

注意索引这里跟自然输入的差值
运行结果

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

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

写出了if和elif的框架,其实问题也就清晰了许多
接下来一步步完善每个if情况的代码,这里是添加词组的情况
最后完善查询词组的代码,包含报错部分
运行结果

小结

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容