
6-1 认识列表
其实在其他程序语言中,相似的功能称作数组(array),不过,Python的列表功能除了可以存储相同的数据类型,例如:整数、浮点数、字符串,也可以存储不同数据类型,例如,列表内同时含有整数、浮点数和字符串。甚至一个列表也可以内含其他列表(将在6-7节讲解)或是字典(dict)(将在9-3节讲解)。因此,Python比其他程序语言更强大。
6-1-1 列表基本定义
定义列表的语法格式如下。
name_list=[元素1,…,元素n] # name_list是假设的列表名称
列表中的每一个数据称为元素,这些元素放在中括号[ ]内,彼此用逗号“,”隔开。上述最后一个元素n右边可以有逗号“,”或省略此逗号语法皆正确。如果要打印列表内容,可以使用print()函数,将列表名称当作变量名称即可。
实例1:NBA球员James前5场比赛得分分别是23、19、22、31、18,可以用下列方式定义列表。

实例2:为所销售的水果,苹果、香蕉、橘子建立列表,可以用下列方式定义列表。

在定义列表时,元素内容也可以使用中文。
实例3:为所销售的水果,苹果、香蕉、橘子建立中文元素的列表,可以用下列方式定义列表。

实例4:在实例1的James列表中,增加第一个元素,添加他的全名。

程序实例ch6_1.py:定义列表同时打印,最后使用type()列出列表数据类型。

执行结果

6-1-2 读取列表元素
我们可以用列表名称与索引读取列表元素的内容,在Python中元素是从索引值0开始。所以如果是列表的第一个元素,索引值是0,第二个元素索引值是1,其他以此类推,如下所示。
name_list[i] #读取索引i的列表元素
程序实例ch6_2.py:读取列表元素的应用。

执行结果

上述程序经过第2行的定义后,列表索引值的概念如下。

所以程序第3~7行,可以得到上述执行结果。其实也可以将2-9节等号多重指定的概念应用于列表。
程序实例ch6_2_1.py:一个传统处理列表元素内容方式,与Python多重指定概念的应用。

执行结果

上述程序第11行让整个Python设计简洁许多,这是Python高手常用的程序设计方式。在上述设计中第11行的多重指定变量的数量需与列表元素的个数相同,否则会有错误产生。其实懂得用这种方式设计,才算是真正了解Python语言的基本精神。
6-1-3 列表切片
在设计程序时,常会需要取得列表前几个元素、后几个元素、某区间元素或是依照一定规则排序的元素,所取得的系列元素也可称为子列表,这个过程称为列表切片,此时可以用下列方法。
name_list[start:end] #读取从索引start到(end-1)的列表元素 name_list[:n] #取得列表前n名 name_list[n:] #取得列表索引n到最后 name_list[-n:] #取得列表后n名 name[:] #取得所有元素,将在6-8-3节讲解
下列是读取区间,使用step作为步长读取。
name_list[start:end:step] #每隔step,读取从索引start到(end-1)的列表元素
程序实例ch6_2_2.py:列出特定区间球员的得分子列表。

执行结果

程序实例ch6_3.py:列出球队前三名队员、从索引1到最后一名队员以及后三名队员子列表。

执行结果

6-1-4 列表索引值是-1
在列表使用中,如果索引值是-1,代表是最后一个列表元素。
程序实例ch6_4.py:列表索引值是-1的应用,由下列执行结果可以得到列出了各列表的最后一个元素。

执行结果

其实在Python中索引-1代表最后一个元素,-2代表倒数第二个元素,其他负索引概念可以以此类推,可参考下列实例。
程序实例ch6_4_1.py:使用负索引列出warriors列表内容。

执行结果

6-1-5 统计列表最大值max()、最小值min()、总和sum()
Python有一些执行统计运算的函数,如果列表内容全部是数值,则可以使用max()函数获得列表的最大值,min()函数可以获得列表的最小值,sum()函数可以获得列表的总和。如果列表内容全部是字符或字符串,则可以使用max()函数获得列表的Unicode码值的最大值,min()函数可以获得列表的Unicode码值最小值。sum()则不可使用在列表元素为非数值的情况。
程序实例ch6_5.py:计算james球员5场的最多得分、最少得分和5场的得分总计。

执行结果

上述程序很快地获得了统计信息,读者可能会想,如果在列表内含有字符串,例如,程序实例ch6_1.py中的James列表,这个列表第一个元素是字符串,这时仍然直接用max(James)会有错误。

碰上这类的字符串可以使用6-1-2节中的方式,用切片方式处理,如下所示。
程序实例ch6_6.py:重新设计ch6_5.py,但是使用James列表。

执行结果

6-1-6 列表个数len()
程序设计时,可能会增加元素,也有可能会删除元素,时间久了即使是程序设计员自己也无法得知列表内剩余多少元素,此时可以借用本节的len()函数,这个函数可以获得列表的元素个数。
程序实例ch6_7.py:重新设计ch6_5.py,增加场次数据。

执行结果

6-1-7 更改列表元素的内容
可以使用列表名称和索引值更改列表元素的内容。
程序实例ch6_8.py:修改James第5场比赛分数。

执行结果

这个概念可以用于更改整数数据,也可以修改字符串数据。
程序实例ch6_9.py:一家汽车经销商原本可以销售Toyota、Nissan、Honda,现在Nissan销售权被回收,改成销售Ford,可用下列方式设计销售品牌。

执行结果

6-1-8 列表的相加
Python是允许列表相加的,相当于将列表结合。
程序实例ch6_10.py:一家汽车经销商原本可以销售Toyota、Nissan、Honda,现在并购一家销售Audi、BMW的经销商,可用下列方式设计销售品牌。

执行结果

程序实例ch6_11.py:整数列表相加的实例。

执行结果

6-1-9 列表乘以一个数字
如果将列表乘以一个数字,这个数字相当于是列表元素重复次数。
程序实例ch6_12.py:将列表乘以数字的应用。

执行结果

6-1-10 列表元素的加法运算
既然可以读取列表内容,其实就可以使用相同的思路操作列表内的元素数据。
程序实例ch6_13.py:建立Lebron James和Kevin Love在比赛中的得分列表,然后利用列表元素加法运算,列出两个人在第四场比赛的得分总和。

执行结果

需注意由第2行列表定义可知,James[0]是指Lebron James,James[1]是第一场得分23,所以James[4]是第四场得分31。第3行Love列表,含义相同。
6-1-11 删除列表元素
可以使用下列方式删除指定索引的列表元素。
del name_list[i] #删除索引i的列表元素
下面是删除列表区间元素。
del name_list[start:end] #删除从索引start到(end-1)索引的列表元素
下面是删除区间,用step作为步长。
del name_list[start:end:step] #每隔step,删除从索引start到(end-1)索引的列表元素
程序实例ch6_14.py:如果NBA勇士队主将阵容有5名,其中一名队员Bell离队了,可用下列方式设计。

执行结果

程序实例ch6_15.py:删除列表元素的应用。

执行结果

以这种方式删除列表元素最大的缺点是,删除元素后我们无法得知删除的是什么内容。有时我们设计网站时,可能想将某个人从VIP客户降为一般客户,采用上述方式删除元素时,就无法再度取得所删除的元素数据,后面会介绍另一种删除数据方式,删除后还可再利用所删除的数据。又或者你设计一个游戏,敌人是放在列表内,采用上述方式删除所杀死的敌人时,我们就无法再度取得所删除的敌人元素数据,如果想取得的话,可以在杀死敌人坐标位置放置庆祝动画等。
6-1-12 空列表的判断
如果想建立一个列表,可是暂时不放置元素,可使用下列方式声明。
name_list=[ ] #这是空的列表
程序实例ch6_16.py:删除列表元素的应用,这个程序基本上会用len()函数判断列表内是否有元素数据,如果有则删除索引为0的元素,如果没有则提示列表内没有元素了。

执行结果

6-1-13 删除列表
Python也允许删除整个列表,列表一经删除后就无法复原,同时也无法做任何操作了,下面是删除列表的方式。
del name_list #删除列表name_list
实例1:建立列表、打印列表、删除列表,然后尝试再度打印列表结果时将出现错误消息,因为列表经删除后已经不存在了。
