Python 3.6零基础入门与实战
上QQ阅读APP看书,第一时间看更新

2.5 列表

列表表示一组有序的元素,比如每个学生有学号、姓名、性别这3个属性,我们就可以把这3个属性放在一个列表中。Python中的列表类似其他语言的数组,细节上有所不同,但存储概念上类似。本节将介绍列表的使用。

2.5.1 使用列表

1.普通定义

列表使用[ ]闭合定义,比如一个学生列表:

    stu1=['10001','张晓光','男']

也可以定义一个成绩列表,全部是数字:

    score1=[45,68,98]

列表中的元素可以是任意数据类型,也可以多种数据类型混合使用,给学生列表添加年龄属性:

    stu1=['10001','张晓光','男',20]

列表也可以初期定义为空,然后使用列表的append函数向其追加元素,该函数只能包括一个参数。

    stu1=[]
    stu1.append('张晓光')

相信很多读者听说过二维数组,就是数组的元素也是数组。同理,列表的元素也可以是列表,我们也可以称之为二维列表。它使用[[],[],[]]这种方式,下面创建3条学生信息:

    stu1=[['10001','张晓光','男',20],['10002','李淑霞','女',21],['10003','王心智','男',19]]

也可以看起来更直接一些:

    stu1=[
        ['10001','张晓光','男',20],
        ['10002','李淑霞','女',21],
        ['10003','王心智','男',19]
    ]

要访问第2个学生的年龄,可以使用stu1[1][3],第1个[]表示访问第几行,第2个[]表示访问第几列,也就是使用stu1[row][col]来访问二维列表中的元素。

2.快速定义

列表还可以使用快速定义的方式:

    stu1=[0]*width

0是默认的内容,width是个数,比如要定义4个元素的列表:

    stu1=[0]*4

创建学生列表,然后逐个赋值:

【示例2-13】

输出结果为:

    学生: [0, 0, 0, 0]
    学生: ['10001', '张晓光', '男', 20]

那么,二维列表是否也可以这样快速定义呢?

先来快速定义一个3行4列的列表,然后给第1行第1列赋值'10001':

【示例2-14】

我们会以为输出结果只是第1行第1列的值改变了,但输出结果却是:

    学生: [['10001', 0, 0], ['10001', 0, 0], ['10001', 0, 0], ['10001', 0, 0]]

第1列的结果全部改变了。因为[[]]是一个含有一个空列表元素的列表,[[]]*4表示4个指向这个空列表元素的引用,所以修改任何一个元素都会改变整个列表。

那如何快速定义二维列表呢?

【示例2-15】

此时输出结果如下,正是我们需要的结果。

    学生: [['10001', 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

这是通过一种循环的方式创建二维列表,相信读者学完for...in语句后会有更深的感悟。

2.5.2 访问列表

使用列表后,经常需要访问其中的某一个元素,Python中直接用索引访问,索引从0开始,负数表示从倒数的位置开始。比如访问第1个元素,用[0],访问倒数第1个元素,用[-1]:

    stu1=['10001','张晓光','男',20]
    print('学生学号:%s,学生年龄:%d'%(stu1[0],stu1[-1]))
    
# 学生学号:10001,学生年龄:20

如果要访问部分元素,可以使用[start:end]切片形式,从start位置开始访问,一直到end位置之前,比如[1:3]就是访问第2个元素到第4个元素之前,就是2、3两个元素。

    stu1=['10001','张晓光','男',20]
    print('学生:',stu1[1:3])
# 学生: ['张晓光', '男']

2.5.3 列表常用的内置函数

Python为列表提供了一系列函数,如追加、插入、排序、移除等,常见的函数参见表2.7。

表2.7 列表常用的内置函数

还是使用前面创建的列表stu1,下面演示几个函数的使用:

【示例2-16】

上述代码的输出结果如图2.11所示。

图2.11 列表函数应用

这里有几点要特别说明:

(1)使用pop移除元素时,指定的索引可以为空,也可以为正负数。为空时,是移除列表最后的元素;为负数时,是从倒数位置移除指定的元素。

(2)追加另一个列表时,追加的内容并不会与原列表组成二维列表,而是在原列表中追加一些元素,因此获取位置时出现的是6,而不是stu1[][]这种形式。

(3)使用sort函数时出现了如下错误,因为列表中元素的类型不限定,本例中包含了字符串和数字,所以这里出现运行错误。

    stu1.sort()
    TypeError: '<' not supported between instances of 'int' and 'str'

要了解这个错误,笔者把sort函数单独列出来介绍,继续下一节。

2.5.4 列表排序

在Python中,排序使用sort,语法如下,这两个参数都是可选的。

    sort (key=None, reverse=False)
1.普通排序(升序或降序)

如果列表中的元素是统一的单一数据类型,就直接使用sort(),默认升序。例如:

【示例2-17】

默认为升序,要是使用降序呢?sort函数中有一个reverse参数,将其设置为True,就可以实现降序:

【示例2-18】

2.副本排序

如果要排序,但并不修改原来的内存位置,这个时候就要用到副本排序。先来看一段代码:

【示例2-19】

输出结果:

    成绩1: [59, 80, 98, 100]
    成绩2: [59, 80, 98, 100]
    位置: 2134350122056 2134350122056

如果直接使用赋值的方式创建一个副本,发现两者的存储位置一致,都进行了排序,这个时候并不能实现真正的副本排序。我们需要用切片方式[:]进行赋值:

【示例2-20】

输出结果如下:

    成绩1: [80, 100, 98, 59]
    成绩2: [59, 80, 98, 100]
    位置: 2948369107848 2948359917512

可以看到score1并没有被排序,而且两者的位置也不相同。

3.复杂排序

sort函数中有一个key参数,用于定义排序过程中调用的函数。key是带一个参数的函数,用于为每个元素提取比较值,默认为None,即直接比较每个元素。比如要通过列表中元素的长度进行排序:

    stu1=['10001','男','张晓光'];
    stu1.sort(key=len)
    print('学生:',stu1)     # 学生: ['男', '张晓光', '10001']

key指定的函数只能有一个输入参数,也只能有一个返回值。可以使用Python自带的函数,比如上述代码的len,也可以自定义函数。

下面自定义一个函数comp,有一个输入参数x。函数中先用type判断x的数据类型,如果不是str(字符串)类型,就返回'0',如果是str类型,就直接返回x,即保持原来的值不变。

【示例2-21】

代码中使用key=comp让stu1列表的排序按我们自定义的方式。因为列表中既有字符串又有数字,而自定义函数的意思是将数字换为'0',也就是让其保持最小值,以方便排序时保证它在前面的位置,所以最终实现了数字在前、字符串在后的排序。

2.5.5 删除列表

前面介绍列表函数时,使用remove、pop这两个函数删除列表中的元素。本小节再介绍两个函数,即del和clear。

clear也是列表的函数,不是删除某个元素,而是清空列表:

del用法和pop类似,也是删除指定索引的位置,并可以使用切片方法删除。

提 示

如果stu1不指定删除的位置,直接使用del stu1会删除整个列表,此时如果再访问stu1,会提示该变量未定义的错误。读者请自行测试一下。

2.5.6 获取列表中的最大值和最小值

Python提供了几个函数用于操作列表,如获取列表的个数、最大值、最小值等,这些使用方法比较简单,这里简单讲解一下。

• len(list):列表元素个数。

• max(list):返回列表中元素的最大值。

• min(list):返回列表中元素的最小值。

直接写一段代码:

【示例2-22】

这里定义一个成绩列表,然后选出所有成绩的最大值和最小值,结果如下:

    4个成绩
    成绩最高: 100
    成绩最低: 59

2.5.7 列表常用运算符

数字有+、-、*、/等运算符,字符串有+、-、[]、[:]等运算符,列表也有一些运算符,如表2.8所示。

表2.8 列表常用运算符

演示一段代码:

【示例2-23】

输出结果如下:

    stu1+stu1: ['101', '张晓光', '男', 20]
    stu1*2: ['101', '张晓光', '101', '张晓光']
    101 in stu1: True