4.1.1 列表list

列表是Python中最基本的数据结构,是最常用的Python数据类型。列表将由若干数据作为元素的序列放置在一对中括号中,元素之间以逗号分隔。Python列表元素可以由任意类型的数据构成。同一列表中各元素的类型可以各不相同。列表中的元素允许重复。此外,Python列表是可以修改的,修改方式包括向列表添加元素、从列表删除元素以及对列表的某个元素进行修改。

1. 列表创建

列表的创建,即用一对中括号将以逗号分隔的若干数据(表达式的值)括起来。下面是几种创建列表的例子:

在Python中,经常用到列表中的列表,即二维列表。这种情况下,列表中的元素也是列表。

2. 列表访问

列表访问,也就是对列表的索引操作的过程,并返回索引位置上的元素。列表中的每个元素被关联一个序号,即元素的位置,也称为索引。索引值从0开始,第二个是1,以此类推,从左向右逐渐变大;列表也可以从后往前,索引值从-1开始,从右向左逐渐变小。该访问方式适用于所有序列类型的对象:列表、元组、字符串。序列的访问如图4.1所示。

图4.1 序列中元素的访问

1)一维列表的访问

列表的索引操作,如果索引超出了范围,则会导致出错。

另外,列表vehicle有4个元素,正向访问列表vehicle的合法索引范围是0~3,逆向访问列表vehicle的合法索引范围是-1~-4,其中vehicle[0]和vehicle[-4]、vehicle[1]和vehicle[-3]、vehicle[2]和vehicle[-2]、vehicle[3]和vehicle[-1]访问的元素相同。我们可以看出,若一个列表有n个元素,则访问元素的合法索引范围是-n~n-1,当序号x为负时,表示从右边计数,其访问的元素实际为序号为nx的元素。这个规律对所有序列类型均有效。

2)二维列表的访问

对二维列表中的元素进行访问,需要使用两对中括号来表示,第一个表示选择子列表,第二个在选中的子列表中再选择其元素。

3. 修改元素

列表中的元素可以通过重新赋值来更改某个元素的值,要注意列表元素的合法索引范围,超过范围则会出错。

4. 列表切片

在列表中,可以使用切片操作来选取指定位置上的元素组成新的列表。简单的切片方式为:

需要提供开始值start和结束值end作为切片的开始和结束索引边界。开始值start索引位置上的元素是包含在切片内的,结束值end索引位置上的元素则不包括在切片内;当切片的左索引start为0时可默认,当右索引end为列表长度时也可默认。这个简单的切片操作从原列表中选取索引位于[start,end)区间内的元素组成新的列表。

当然,对列表切片操作时,也可以使用负数作为索引。

以上列表切片操作都是获取索引值位于[start,end)区间内的连续位置上的元素组成新列表。也就是切片选取元素时,索引值每次增长的步长为1。其实,切片操作也可以提供一个非零整数(即可正可负,但不能为0)作为索引值增长的步长step值。使用方式为:

当步长为1时,step参数可以省略。前面列表的切片操作步长均为1,所以可以省略步长。当步长step不为1时,该参数不可省略。切片操作适用于所有序列类型。

当切片开始值与结束值均省略,且步长step大于0,表示在整个原列表范围内,切片索引从第0个位置开始,每次增长step,直到超过原列表的索引范围。

另外,利用切片还可以更改元素值。

5. del命令

使用del命令可以从列表中删除元素,也可以删除整个列表。

另外,remove()、pop()、clear()方法均能实现列表元素的删除,请参考下面介绍的列表方法。

6. 列表运算

1)列表相加

通过列表相加的方法生成新列表。

2)列表相乘

用数字n乘以一个列表,会生成一个新列表。在新列表中原来列表的元素将被重复n次。

7. 列表方法

列表中的方法可看作是作用于Python中列表这一特定类型对象的函数。

1)index(value[,start=0[,stop]])

index()方法用于从列表中找出与value值匹配的第一个元素索引位置。如果没有指定参数start的值,则从索引为0的位置开始查找,否则从索引为start的位置开始查找。如果没有指定结束索引位置stop的值,可以查找到列表最后元素,否则在位于[start,stop)内的索引区间查找。如果找不到匹配项,就会引发异常。

实际上可以先使用in运算符测试某个元素是否在该列表中,避免用index()查找索引位置时由于找不到指定元素而导致的错误。

2)count()

count()方法,用于统计某个元素在列表中出现的次数。

添加列表元素除了前面介绍的“+”“+=”“∗”“∗=”运算符以外,还有append()、extend()、insert()方法。

3)append()

append()方法,追加单个元素到列表的尾部,只接受一个元素,元素可以是任何数据类型,被追加的元素在列表中保持着原结构类型。例如:

4)extend()

extend()方法,在列表的末尾一次性追加另一个列表中的多个值,可以用新列表扩展原有的列表。

5)insert()

insert()方法,将一个元素插入到列表中的指定位置。列表的insert方法有两个参数,第一个参数是索引点,即插入的位置,第二个参数是插入的元素。

删除列表元素除了前面介绍的del命令以外,还有remove()、pop()和clear()方法。

6)remove()

remove()方法,用于移除列表中与某值匹配的第一个元素。如果找不到匹配项,就会引发异常。

7)pop()

pop()方法用于移除列表中的一个元素(默认为最后一个元素),并且返回该元素的值。pop()方法可以指定索引位置,当不在索引范围内或者从空列表中使用此方法均会触发异常。

8)clear()

clear()方法用于删除列表中所有元素,但保留列表对象。

请注意与del命令的区别,del命令删除整个列表时,列表对象不再保留。

列表排序有reverse()、sort()方法,还有reversed()、sorted()函数,函数的用法请参看列表函数部分的介绍。

9)reverse()

reverse()方法,用于将列表中的元素位置反向存放。列表中可以有不同类型的元素,reverse()方法只是将位置反转。

10)sort()

sort()方法,用于将列表中的元素进行排序。默认按升序排列。使用reverse参数来指明列表是否降序排列,参数是简单的布尔值True或False,若其值等于True表示降序排序,默认为False。如果列表中包含的是字符串,按字母排序规则排序。可以使用key参数。

8. 列表函数

1)len()函数

len()函数,用于返回列表中所包含元素的个数。例如:

2)max()函数

max()函数,用于返回列表中元素的最大值。

如果列表中包含的是字符串,按照字符串的比较大小方法排序返回最大值。

列表中只能包含可相互比较的元素,如列表元素中既有数字又有字符串则会出错。

3)min()函数

min()函数,用于返回列表中所包含元素的最小值。同样,如果列表中包含的是字符串,也按字符串的比较大小方法排序返回最小值,列表中只能包含可相互比较的元素。

4)reversed()函数

reversed()函数,将列表中的元素位置反向并返回可迭代的reversed对象。可以和list()函数联合起来使用得到列表。例如:

5)sorted()函数

sorted()函数,对列表进行排序并返回新列表。例如:

思考:请比较sorted()函数和sort()方法的异同。

9. 列表遍历

可以通过for语句或者while语句循环遍历列表中所有元素。

【例4-1】 给定一个由10个整数值构成的列表[10,9,8,7,6,5,4,3,2,1],编程只对列表中下标为偶数的元素进行升序排列。

程序代码:

程序运行结果:

【例4-2】 用户分别从键盘输入4个整数和3个整数组成两个列表list1和list2,将列表list2合并到list1中,并在list1末尾再添加两个数字90和100,然后对list1降序排列,最后输出最终的列表list1。

程序代码:

程序可能的一次运行结果:

思考1:列表list2合并到list1中可以用此语句list1=list1+list2实现吗?

思考2:在list1末尾再添加两个数字90和100可以用append吗?如果可以,如何实现?

思考3:如果是通过键盘输入两个数字添加到list1末尾程序如何实现?

例如在上例中,程序改为通过键盘输入两个数字90、100添加到list1末尾,程序可以写成:

【例4-3】 某公司股票近一段时间的收盘价(单位:元)分别为:12.04,11.15,13.47,13.58,12.04,12.04,11.15,12.58,11.15,请建立一个列表(data)存储这些数据。请编写程序解决如下问题:

(1)上述一共有几个数据?

(2)统计收盘价为12.04元的次数;

(3)找出收盘价中的最小数据,并删除首次出现的最小数据,最后显示列表data。

程序代码:

程序运行结果:

思考:如果要删除所有出现的最小数据,程序如何实现?

第1种方法:

程序代码:

程序运行结果:

第2种方法:

程序代码: