
4.2 列表
Python中的列表是由一系列按特定顺序排列的元素组成的。它是Python中内置的可变序列。在形式上,列表的所有元素都放在一对中括号“[]”中,两个相邻元素间使用逗号“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到列表中,并且同一个列表中元素的类型可以不同,因为它们之间没有任何关系。由此可见,Python中的列表是非常灵活的,这一点与其他语言不同。
4.2.1 列表的创建与删除
1.列表的创建
(1)使用赋值运算符直接创建列表
同其他类型的Python变量一样,创建列表时,也可以使用赋值运算符“=”直接将一个列表赋值给变量,具体的语法格式如下。

其中,listname表示列表的名称,可以是任何符合Python命名规则的标识符:“元素1、元素2、元素3、元素n”表示列表中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。例如:

(2)创建空列表
在Python中,也可以创建空列表,例如,要创建一个名称为emptylist的空列表,可以使用代码:emptylist=[]。
(3)创建数值列表
在Python中,数值列表很常用。例如,在考试系统中记录学生的成绩、在游戏中记录每个角色的位置,以及各个玩家的得分情况等都可应用数值列表。在Python中,可以使用list,函数直接将range函数循环出来的结果转换为列表。
list函数的基本语法格式如下。

其中,data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。例如,创建一个10~20之间(不包括20)所有偶数的列表,可以使用下面的代码。

使用list函数时,不仅能通过range对象创建列表,还可以通过其他对象创建列表。
2.删除列表
对于已经创建的列表,不再使用时,可以使用del语句将其删除。语法格式如下。

其中,listname为要删除列表的名称。del语句在实际开发时并不常用。因为Python自带的垃圾回收机制会自动销毁不用的列表,所以即使不手动将其删除,Python也会自动将其回收。在删除列表前,一定要保证输入的列表名称是已经存在的,否则将出现错误。
4.2.2 列表元素的访问与遍历
1.采用下标法访问列表元素
在Python中,如果想将列表的内容输出也比较简单,可以直接使用print函数。在输出列表时,是包括左右两侧的中括号的。如果不想要输出全部的元素,也可以通过列表的索引获取指定的元素,即使用下标索引来访问列表中的值,同样也可以使用方括号的形式截取字符。在输出单个列表元素时,不包括中括号,如果是字符串,不包括左右的引号。
【例4-7】 下标法访问列表元素示例。

运行结果:

2.遍历列表
列表的循环遍历是指依次打印列表中的各个数据。在Python中遍历列表的方法有多种,下面介绍5种常用的方法。
(1)直接使用for循环实现
直接使用for循环遍历列表只能输出元素的值,它的语法格式如下。

其中,item用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可;listname为列表名称。
【例4-8】 用for语句输出对目前生活产生影响的四个方面:高铁、扫码支付、共享单车和网购。

运行结果:

(2)使用for循环和enumerate函数实现
使用for循环和enumerate函数可以实现同时输出索引值和元素内容的功能。它的语法格式如下。

参数说明:
● index:用于保存元素的索引。
● Item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。
● listname为列表名称。
● enumerate函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。
其语法结构为:enumerate(sequence,[start=0])。
参数说明:
● sequence:一个序列、迭代器或其他支持迭代对象。
● start:下标起始位置。
【例4-9】 请输出科技对生活改变的四个方面:高铁、扫码支付、共享单车和网购。

运行结果:

(3)利用while语句输出列表的各个元素
【例4-10】 用while语句输出对目前生活产生影响的四个方面:高铁、扫码支付、共享单车和网购。


运行结果:

(4)利用索引遍历
【例4-11】 用索引输出对目前生活产生影响的四个方面:高铁、扫码支付、共享单车和网购。

运行结果:

(5)利用iter()方法生成迭代器遍历
iter()方法的语法格式为:

参数说明:
● object:支持迭代的集合对象。
● sentinel:如果传递了第二个参数,则参数object必须是一个可调用的对象(如函数),此时,iter创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用object。
【例4-12】 用索引输出对目前生活产生影响的四个方面:高铁、扫码支付、共享单车和网购。

运行结果:

4.2.3 列表元素的常用操作(增、删、改、查)
列表可以一次性存储多个数据,且可以为不同数据类型。由于列表可以一次性存储多个数据,可以对这些数据进行的操作有:增、删、改、查。增加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新操作。
1.增加元素的方法
在4.1.2节序列的基本操作中介绍了可以通过“+”号将两个序列连接,通过该方法也可以实现为列表增加元素。但是这种方法的执行速度要比直接使用列表对象的append()方法慢,所以建议在实现增加元素时,使用列表对象的append()方法实现。
(1)append()方法
append()方法用于在列表末尾添加新的对象。其语法格式为:

其中,listname为要添加元素的列表名称;obj为要添加到列表末尾的对象。该方法无返回值,但是会修改原来的列表。
【例4-13】 请输出科技对生活改变的四个方面:高铁、扫码支付、共享单车和网购。

运行结果:

由上述例子可以看出:
列表追加数据的时候,直接在原列表里面追加了指定数据,即修改了原列表,故列表为可变类型数据。
列表可包含任何数据类型的元素,单个列表中的元素无须全为同一类型。append()方法向列表的尾部添加一个新的元素。
列表是以类的形式实现的。“创建”列表实际上是将一个类实例化。因此,列表有多种方法可以操作。
如果append()方法追加的数据是一个序列,则追加整个序列到列表。
(2)extend()方法
extend()方法用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表),如果数据是一个序列,则将这个序列的数据逐一添加到列表。
extend()方法的语法格式为:

参数说明:
● seq:元素列表,可以是列表、元组、集合、字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。
● 返回值:该方法没有返回值,但会在已存在的列表中添加新的列表内容。
【例4-14】 extend()方法的应用。


运行结果:

extend()方法也可以给列表添加不同数据类型。
【例4-15】 extend()方法给列表添加不同数据类型的示例。

运行结果:

(3)insert()方法
insert()方法用于将指定对象插入列表的指定位置。
insert()方法的语法格式为:

参数说明:
● index:对象obj需要插入的索引位置。
● obj:要插入列表中的对象。
返回值:该方法没有返回值,但会在列表指定位置插入对象。
【例4-16】 insert()方法应用示例。

运行结果:

2.删除元素的方法
删除元素主要有两种情况,一种是根据索引删除,另一种是根据元素值进行删除。下面分别进行介绍。
(1)根据索引删除元素
删除列表中的指定元素和删除列表类似,也可以使用del语句实现。
【例4-17】 定义一个保存4个元素的列表,删除最后一个元素。

运行结果:

(2)根据元素值删除元素
如果想要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的remove()方法实现。该方法没有返回值,但是会移除列表中的某个值的第一个匹配项。
【例4-18】 定义一个保存4个元素的列表,删除“共享单车”元素。

运行结果:

使用列表对象的remove()方法删除元素时,如果指定的元素不存在,将显示异常信息。所以在使用remove()方法删除元素前,最好先判断该元素是否存在,改进后的代码如下。

运行结果:

列表对象的count()方法用于判断指定元素出现的次数,当返回结果为0时,表示不存在该元素。
(3)pop()方法
pop()方法用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
pop()方法的语法格式为:

参数说明:
index:可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为index=-1,删除最后一个列表值。
返回值:该方法返回从列表中移除的元素对象。
【例4-19】 pop()方法应用示例。

运行结果:

(4)clear()方法
clear()方法用于清空列表,类似于del a[:]。
clear()方法的语法格式为:
list.clear()
【例4-20】 clear()方法应用示例。

运行结果:

3.修改元素的方法
(1)修改指定下标数据
修改列表中的元素只需要通过索引获取该元素,然后再为其重新赋值即可。例如,定义一个保存3个元素的列表,然后修改索引值为2的元素。
【例4-21】 定义一个保存4个元素的列表,将第3个元素改为“单车共享”。

运行结果:

(2)reverse()方法
reverse()方法用于反置列表中的元素。
reverse()方法的语法格式为:

返回值:该方法没有返回值,但是会对列表的元素进行反向排序。
【例4-22】 reverse()方法应用示例。

运行结果:

(3)copy()方法
copy()方法用于复制列表,类似于a[:]。
copy()方法的语法格式为:

【例4-23】 copy()方法应用示例。

运行结果:

4.查找元素的方法
(1)index()方法
index()方法用于从列表中找出某个值第一个匹配项的索引位置,即获取指定元素首次出现的下标。
index()方法的语法格式为:

参数说明:
● x:查找的对象。
● start:可选,查找的起始位置。
● end:可选,查找的结束位置。
返回值:该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
【例4-24】 index()方法的应用示例。

运行结果:1
(2)count()方法
count()方法用于统计某个元素在列表中出现的次数。
count()方法的语法格式为:

参数说明:
obj:列表中统计的对象。
返回值:返回元素在列表中出现的次数。
【例4-25】 count()方法的应用示例。

运行结果:1
(3)len()方法
len()方法的功能是返回列表元素的个数。
len()方法的语法格式为:

参数说明:
list:要计算元素个数的列表。
返回值:返回列表元素个数。
【例4-26】 count()方法的应用示例。

运行结果:4
(4)用in判断是否存在
通常可以用in判断指定数据是否在某个列表序列,如果在,则返回True,否则返回False。用not in判断指定数据是否不在某个列表序列,如果不在,则返回True,否则返回False。
【例4-27】 注册邮箱,用户输入一个账号名,判断这个账号名是否存在,如果存在,提示用户名已存在,否则提示可以注册。

运行结果:

4.2.4 列表元素的统计与排序
1.列表元素的统计
在Python中,提供了sum()方法用于统计数值列表中各元素的和。
sum()方法的语法格式为:

参数说明:
● listname:表示要统计的列表。
● start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),是可选参数,如果没有指定,默认值为0。
【例4-28】 sum()方法的应用示例。

运行结果:285
2.列表元素的排序
Python中提供了两种常用的对列表进行排序的方法。
(1)使用列表对象的sort()方法实现
列表对象提供了sort()方法用于对原列表中的元素进行排序。排序后原列表中的元素顺序将发生改变。
sort()方法的语法格式为:

参数说明:
● listname:表示要进行排序的列表。
● key:表示指定一个从每个列表元素中提取一个比较键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。
● reverse:可选参数,如果将其值指定为True,则表示降序排列,如果为False,则表示升序排列。默认为升序排列。
【例4-29】 用sort()方法对列表排序。

运行结果:
原列表:['pku','tsinghua','fudan','sjtu','nju','zju','ustc','hit','xjtu']
列表默认升序:['fudan','hit','nju','pku','sjtu','tsinghua','ustc','xjtu','zju']
原列表降序:['zju','xjtu','ustc','tsinghua','sjtu','pku','nju','hit','fudan']
使用sort()方法进行数值列表的排序比较简单,但是使用sort()方法对字符串行表进行排序时,采用的规则是先对大写字母进行排序,然后再对小写字母进行排序。如果想要对字符串行表进行排序(不区分大小写时),需要指定其key参数。例如,定义一个保存英文字符串的列表,然后应用sort()方法对其进行升序排列:c.sort(key=str.lower)。
采用sort()方法对列表进行排序时,对于中文的支持不好。排序的结果与我们常用的音序排序法或者笔画排序法都不一致。如果需要实现对中文内容的列表排序,还需要重新编写相应的方法进行处理,不能直接使用sort()方法。
(2)使用内置的sorted函数实现
在Python中,提供了一个内置的sorted函数,用于对列表进行排序。使用该函数进行排序后,原列表的元素顺序不变。
sorted函数的语法格式为:

参数说明:
● listname:表示要进行排序的列表名称。
● key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。
● reverse:可选参数,如果将其值指定为True,则表示降序排列,如果为False,则表示升序排列。默认为升序排列。
【例4-30】 用sorted()方法对列表排序。

运行结果:
列表默认升序:['fudan','hit','nju','pku','sjtu','tsinghua','ustc','xjtu','zju']
原列表降序:['zju','xjtu','ustc','tsinghua','sjtu','pku','nju','hit','fudan']
原列表:['pku','tsinghua','fudan','sjtu','nju','zju','ustc','hit','xjtu']
(3)列表对象的sort()方法和内置sorted函数区别
列表对象的sort()方法和内置sorted函数的作用基本相同,所不同的就是使用sort()方法时,会改变原列表的元素排列顺序,但是使用sorted函数时,会建立一个原列表的副本,该副本为排序后的列表。
4.2.5 列表的嵌套
嵌套列表就是列表中包含列表。嵌套列表可以模拟现实中的表格、矩阵、2D游戏的地图(如植物大战僵尸的花园)、棋盘(如国际象棋、黑白棋)等。
提取嵌套列表中指定位置的元素,可通过:list_name[index1][index2]语句实现,其中index1指第几个小列表,index2指该小列表中第几个元素。
【例4-31】 通过对列表的嵌套应用,实现3×4矩阵的转置行和列。

运行结果:
