列表是Python特有的数据类型,用于存储由多个值构成的序列,其元素可以是字符串、数字、列表、元组等自定义的对象。列表使用[]来定义,用英文逗号分隔开其中的元素,元素是可以重复的。列表可以同时存储多种数据类型,也可以嵌套其他列表。
不同数据项之间由逗号分隔,整体放在一个方括号里,这就是列表。例如:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls)
运行结果为:
[1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
那么,如何定义一个空列表呢?
ls = []
是不是很简单。
方法: 列表名[索引](索引从0开始计数)。
(1)下面来取出刚创建的列表中的嵌套索引及嵌套索引的元素:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls[6], ls[6][0])
运行结果为:
[8, 5, 7] 8
(2)下面再试试取出不存在的索引会引发怎样的结果:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls[7])
运行结果为:
IndexError:string index out of range
直接抛出错误。
(3)与字符串相同,当我们想取出列表中的最后一个字符时,可以直接取索引为−1的值。例如:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls[-1])
运行结果为:
[8, 5, 7]
直接使用加号将两个列表相加,会产生一个新列表,其中包含原来两个列表中的元素。例如:
ls1 = [1, 2, 3] ls2 = ['a', 'b', 'c'] print(ls1 + ls2)
运行结果为:
[1, 2, 3, 'a', 'b', 'c']
方法: 列表 * 复制次数。
将生成一个新列表,新列表中的元素是原列表中的元素的复制次数倍。例如:
ls = [1, 2, 3] print(ls*3)
运行结果为:
[1, 2, 3, 1, 2, 3, 1, 2, 3]
求列表长度将用到len()函数。例如:
ls = [1, 2, 3, [8, 5, 7]] print(len(ls))
运行结果为:
4
通过循环的方式遍历列表元素。例如:
ls = [1, 2, 3, [8, 5, 7]] for i in ls: print(i)
运行结果为:
1 2 3 [8, 5, 7]
使用in关键字检查列表中是否存在某个元素,返回值为布尔值。例如:
ls = [1, 2, 3, [8, 5, 7]] print(8 in ls) print([8, 5, 7] in ls)
运行结果为:
False True
可以使用del关键字手动删除列表(亦可等系统自动回收)。例如:
ls = [1, 2, 3, [8, 5, 7]] del ls print(ls)
运行结果为:
IndexError:string index out of range
删除之后,列表就无法使用了。
也是使用del关键字来删除指定下标的元素。例如:
ls = [1, 2, 3, [8, 5, 7]] print(ls[0]) del ls[0] print(ls[0]) print(ls)
运行结果为:
1 2 [2, 3, [8, 5, 7]]
删除过后,会将后续元素下标往前挪一位。
使用max()和min()函数返回列表中的最大值和最小值。例如:
ls = [1, 2, 3] print(max(ls)) print(min(ls))
运行结果为:
3 1
只适用于列表中的元素只有int、bool、float类型,或只有字符串且都没有嵌套列表的情形;否则,会直接报错。例如:
ls = [1, 2, 3, [8, 5, 7]] print(max(ls)) print(min(ls))
运行结果为:
IndexError:string index out of range
列表切片指的是将列表的一部分切出来,这有点像字符串切片。列表切片的形式:
list[起始索引:终止索引(不包含):步长]
(1)使用时,如果省略起始索引,则默认为0;如果省略终止索引,则默认为列表中的最后一个元素且包含该元素;如果省略步长,则默认为1。例如:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls[:]) print(ls[::]) print(ls[1:5:2])
运行结果为:
[1, 2, 3, 4, 'a', 'b', [8, 5, 7]] [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] [2, 4]
(2)逆序切片也与字符串相似,例如:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls[:-1]) print(ls[::]) print(ls[-5:-1:2])
运行结果为:
[1, 2, 3, 4, 'a', 'b'] [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] [3, 'a']
(3)再试一下其他操作,正向切片起始索引大于终止索引,逆向切片起始索引小于终止索引:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls[-1:-5:2]) print(ls[5:1])
运行结果为:
[] []
不会报错,只是没有切出内容。
列表是一种可变的数据类型,所以可以修改其元素。例如:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls) ls[1] = 'Python' print(ls)
运行结果为:
[1, 2, 3, 4, 'a', 'b', [8, 5, 7]] [1, 'Python', 3, 4, 'a', 'b', [8, 5, 7]]
除了通过索引修改元素外,还能通过切片的方式进行修改。例如:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] print(ls) ls[1:3] = 'a' print(ls)
运行结果为:
[1, 2, 3, 4, 'a', 'b', [8, 5, 7]] [1, 'a', 4, 'a', 'b', [8, 5, 7]]
新插入的元素数量小于切片的元素数量,列表长度会变短。但是,如果插入的是字符串或是列表,那会是什么结果呢?
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] ls[-3:-1] = ['n', 'e', 'w'] print(ls)
运行结果为:
[1, 2, 3, 4, 'n', 'e', 'w', [8, 5, 7]]
没想到吧,对于列表,并不是单纯地修改元素并使列表长度变短,而是把元素插入进去。
一些列表的操作方法如表2-2所示。
表2-2 列表的操作方法
接下来依次进行演示。
(1)list.append(obj),在列表末尾添加新对象:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] ls.append(['a', 'p', 'p']) print(ls)
运行结果为:
[1, 2, 3, 4, 'a', 'b', [8, 5, 7], ['a', 'p', 'p']]
(2)list.count(obj),返回某个元素在列表中出现的次数:
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] print(ls.count(1))
运行结果为:
2
(3)list.extend(seq),在列表末尾添加另一个序列的所有元素:
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] ls2 = ['a', 'p', 'p'] ls.extend(ls2) print(ls)
运行结果为:
[1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3], 'a', 'p', 'p']
(4)list.index(obj),返回第一个匹配元素的索引值:
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] print(ls.index(1))
运行结果为:
0
若不存在,则会报错:
ls = [2, 3, 4, 'a', 'b', [1, 2, 3]] print(ls.index(1))
运行结果为:
ValueError:1 is not in list
(5)list.insert(index, obj),在指定索引之前插入对象:
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] ls.insert(0, ['a', 'p', 'p']) print(ls)
运行结果为:
[['a', 'p', 'p'], 1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
如果指定的索引不存在呢?
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] ls.insert(20, ['a', 'p', 'p']) print(ls)
运行结果为:
[1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3], ['a', 'p', 'p']]
超过最大索引,则会插入在最后一个位置的后面。
(6)list.pop(index),移除指定索引的值,并返回该值:
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] value = ls.pop(-1) print(ls) print(value)
运行结果为:
[1, 2, 3, 4, 1, 'a', 'b'] [1, 2, 3]
(7)list.remove(obj),移除第一个匹配的某对象:
ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]] ls.remove(1) print(ls)
运行结果为:
[2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
(8)list.sort(),对原列表进行排序:
ls = [8, 5, 7, -1, 9, 0, -1] ls.sort() print(ls)
运行结果为:
[-1, -1, 0, 5, 7, 8, 9]
默认升序排列,如果要降序,该怎么实现呢?
ls = [8, 5, 7, -1, 9, 0, -1] ls.sort(reverse=True) print(ls)
运行结果为:
[9, 8, 7, 5, 0, -1, -1]
另外,只能对纯字符或纯数字排序,否则就会报错:
ls = [8, 5, 7, -1, 9, 0, -1, 'a', 'b', 'c'] ls.sort() print(ls)
运行结果为:
TypeError:‘<’not supported between instances of ‘str’and ‘int’
(9)list.reverse(),反转列表元素:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] ls.reverse() print(ls)
运行结果为:
[[8, 5, 7], 'b', 'a', 4, 3, 2, 1]
de关键字可以删除整个列表或者列表中的元素。
(1)删除指定索引元素:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] del ls[0] print(ls)
运行结果为:
[2, 3, 4, 'a', 'b', [8, 5, 7]]
(2)切片删除:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] del ls[:3] print(ls)
运行结果为:
[4, 'a', 'b', [8, 5, 7]]
(3)删除整个列表:
ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]] del ls print(ls)
直接报错:
NameError:name ‘ls’is not defined
在Python中,列表生成式体现了Python优雅的特色。
例如,创建一个元素是1~10的平方的列表:
ls = [i*i for i in range(11)] print(ls)
运行结果为:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
一行代码就可以优雅地搞定。
对于双重或多重循环使用列表生成式,该如何生成列表呢?
将九九乘法口诀表放入列表:
ls = [f'{i} x {j} = {i*j}' for i in range(1, 10) for j in range(1, 10) if i <= j] print(ls)
运行结果为:
['1 × 1 = 1', '1 × 2 = 2', '1 × 3 = 3', '1 × 4 = 4', '1 × 5 = 5', '1 × 6 = 6', '1 × 7 = 7', '1 × 8 = 8', '1 × 9 = 9', '2 × 2 = 4', '2 × 3 = 6', '2 × 4 = 8', '2 × 5 = 10', '2 × 6 = 12', '2 × 7 = 14', '2 × 8 = 16', '2 × 9 = 18', '3 × 3 = 9', '3 × 4 = 12', '3 × 5 = 15', '3 × 6 = 18', '3 × 7 = 21', '3 × 8 = 24', '3 × 9 = 27', '4 × 4 = 16', '4 × 5 = 20', '4 × 6 = 24', '4 × 7 = 28', '4 × 8 = 32', '4 × 9 = 36', '5 × 5 = 25', '5 × 6 = 30', '5 × 7 = 35', '5 × 8 = 40', '5 × 9 = 45', '6 × 6 = 36', '6 × 7 = 42', '6 × 8 = 48', '6 × 9 = 54', '7 × 7 = 49', '7 × 8 = 56', '7 × 9 = 63', '8 × 8 = 64', '8 × 9 = 72', '9 × 9 = 81']