列表(list)用于保存一组有顺序的数据。列表使用方括号 [] 创建,元素之间用逗号分隔。列表的下标(index)从 0 开始,因此第一个元素是 lst[0],不是 lst[1]。
访问列表元素
Python 支持正向索引,也支持反向索引(negative index)。反向索引从 -1 开始,表示最后一个元素。
lst = [1, 2, 3]
print(lst[0]) # 1
print(lst[1]) # 2
print(lst[2]) # 3
print(lst[-1]) # 3
print(lst[-2]) # 2如果访问不存在的位置,例如 lst[3],程序会抛出 IndexError。这是初学者很常见的异常(exception):列表长度是 3,合法正向下标只有 0, 1, 2。
知识测验
列表拼接与重复
+ 可以拼接两个列表,* 可以重复一个列表。
lst = [1, 2, 3] + [4, 5, 6]
print(lst) # [1, 2, 3, 4, 5, 6]
lst = [1, 2, 3] * 3
print(lst) # [1, 2, 3, 1, 2, 3, 1, 2, 3][1, 2, 3] + [4] 得到的是新列表;而 append()、insert() 这类方法(method)会直接修改原列表。
列表元素操作实验
选择方法,只填写它需要的参数,同时观察列表本身和返回值如何变化。
append() → 返回值: —in 运算符
in 用于判断某个元素是否存在于序列(sequence)中,结果是布尔值。
languages = ["C", "C++", "Python", "Java"]
key = input("请输入一种编程语言:")
if key in languages:
print("已找到")
else:
print("未找到")一次可能的运行结果:
请输入一种编程语言:Python
已找到in 不是只适用于列表,它也可以用于元组、集合、字符串和字典。只是对字典使用 in 时,默认检查的是键(key)。
切片
切片(slice)用于截取序列的一部分。基本格式是:
lst[start:end:step]start:开始位置,包含。end:结束位置,不包含。step:步长,默认为1。
lst = list(range(10))
print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(lst[2:7]) # [2, 3, 4, 5, 6]
print(lst[:5]) # [0, 1, 2, 3, 4]
print(lst[3:]) # [3, 4, 5, 6, 7, 8, 9]
print(lst[::2]) # [0, 2, 4, 6, 8]拖动切片,匹配目标范围
从 start 向 end 拖过元素。结束手柄不包含在结果中,和 Python 切片完全一致。
按住任意元素并横向拖动。松开时,最后一个蓝色元素之后的位置就是不包含的 end。
尚未选择知识测验
二维列表
二维列表可以看成“列表中的列表”。它经常用于表示表格、棋盘和矩阵(matrix)。
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
print(matrix[0][0]) # 1
print(matrix[1][2]) # 7matrix[1][2] 的意思是:先取第 1 行(row),再取这一行里的第 2 列(column)。两个下标都从 0 开始。
矩阵加法可以用嵌套循环完成。外层循环控制行,内层循环控制列。
矩阵加减法要求两个矩阵形状相同。如果 A 和 B 都是 m × n 矩阵,那么结果矩阵也是 m × n。所谓“一一对应”,就是第 i 行第 j 列只和另一个矩阵的第 i 行第 j 列计算。
把下面代码中的两个矩阵完整写成数学形式,可以直接看到每个位置如何一一对应相加:
A = [[1, 3], [1, 0], [1, 2]]
B = [[0, 0], [7, 5], [2, 1]]
C = []
print("矩阵加法")
for i in range(3):
C.append([])
for j in range(2):
C[i].append(A[i][j] + B[i][j])
print("%3d" % C[i][j], end='')
print()运行结果:
矩阵加法
1 3
8 5
3 3把列表里的 0 移到末尾
读取一个整数列表,把所有非 0 元素稳定地移到前面,再把 0 放到末尾。
- 读取一个空格分隔的整数列表。
- 保持非 0 元素原有顺序不变。
- 输出处理后的列表。