四、Python —— 列表
文章目录
列表实际上就是 C++ 中的数组
一、列表的初始化
列表是一种常见的变量类型,可以存储一列元素。元素的类型可以不同,不过大多数情况下类型是相同的。
列表需要用 方括号括 起来,中间的元素用 逗号隔开,最后一个元素后可以多加一个逗号。
1.1、直接初始化
a = [] # 定义一个空列表
b = [1, 2] # 含有2个整数的列表
c = [6, "python", 3.14] # 含有3个不同类型元素的列表
print(a, b, c)
"""output
[] [1, 2] [6, 'python', 3.14]
"""
1.2、通过 append 函数初始化
append() 函数的作用是,在列表末尾添加一个元素。
a = []
for i in range(5): # 初始化[0, 0, 0, 0, 0]
a.append(0)
print(a)
n = 4
b = []
for i in range(n): # 初始化[0, 1, 4, 9]
b.append(i * i)
print(b)
1.3、 通过 for 语句初始化列表长度和每个位置的数值
a = [0 for i in range(5)] # 初始化[0, 0, 0, 0, 0]
print(a)
n = 4
b = [i * i for i in range(n)] # 初始化[0, 1, 4, 9]
print(b)
二、访问列表元素
2.1、列表下标可以为负数
可以通过下标读/写列表中的元素,下标从 0 开始,也可以是 负数,负数下标表示的是 除以 列表长度的 余数 对应的位置。负数下标相当于将列表首位相接,然后 从 0 往前数。
2.1、越界的含义
python 中同样有越界的含义,如果列表长度是 n,那么 下标 只能取 -n~n-1之间的值。
a = [0, 1, 2]
print(a[0], a[1], a[2]) # 读取列表中每个位置的值
a[0] = 3 # 给列表中的某个位置写值
print(a)
print(a[-1]) # 由于-1 % 3 = 2,所以表示的是a[2]
三、 使用循环语句遍历列表
3.1、通过下标遍历
a = [2, 1, 4, 5, 3]
for i in range(5):
print(a[i], end=' ')
3.2、通过 for…in… 直接遍历
a = [2, 1, 4, 5, 3]
for x in a:
print(x, end=' ')
练习:假设斐波那契数列的前两项分别是 a0=0, a1=1, 求 an。
n = int(input())
a = [0 for i in range(n + 1)]
a[0] = 1
a[1] = 1
for i in range(2, n+1):
a[i] = a[i-2] + a[i-1]
print(a[n])
四、列表的切片操作
列表的切片操作会返回一个新列表。用法:
a[begin:end]
会返回包含 a[begin], a[begin + 1], ..., a[end - 1]
的列表。begin
时,begin
的默认值为 0。end
时,end
的默认值为 列表长度。begin
和 end
是 负数 时,表示的是 %列表长度
。begin > end
,表示切片为 空。注意:切片这里的 begin 和 end 与 上面列表的下表不同,列表的下标是有 越界 这个概念的,但是切片没有 (也就是说 begin 和 end 的取值范围可以无穷大)。
例如:
a = [0, 1, 2, 3, 4]
print(a[1:4]) # 输出[1, 2, 3]
print(a[1:]) # 输出[1, 2, 3, 4]
print(a[:4]) # 输出[0, 1, 2, 3]
print(a[:]) # 输出[0, 1, 2, 3, 4]
print(a[-4:-1]) # 等价于print(a[1:4])
切片也支持 写操作:
a = [0, 1, 2, 3, 4]
a[1:4] = [2, 3]
print(a) # 输出[0, 2, 3, 4]
五、列表的复制
列表跟其他变量类型不同,如果 用等号 复制 列表,那么 原列表和新列表 是 同一个列表。对新列表修改,会修改原列表的值。例如:
a = [0, 1, 2, 3, 4]
b = a
b[0] = 5
print(a, b) # 会发现a[0]和b[0]都被修改了
"""output
[5, 1, 2, 3, 4] [5, 1, 2, 3, 4]
"""
但是,切片并不是拷贝,切片可以得到一个 原列表的 浅拷贝。此时再修改新列表,原列表就 不会发生变化 了。例如:
a = [0, 1, 2, 3, 4]
b = a[:]
b[0] = 5
print(a, b) # 会发现a[0]没有被修改
"""output
[0, 1, 2, 3, 4] [5, 1, 2, 3, 4]
"""
六、列表的运算
操作 | 效果 |
---|---|
列表 + 列表 | 将两个列表拼接起来,得到一个 新列表 |
列表 * 整数 | 将若干个自身拼接起来,得到一个 新列表 |
加法和乘法的所生成的新列表 c,并不会改变原来都两个列表 a 和 b
a = [0, 1, 2]
b = [3, 4]
c = a + b # c相当于a和b的浅拷贝
print(c) # 输出[0, 1, 2, 3, 4]
d = a * 3 # d相当于a的浅拷贝
print(d) # 输出[0, 1, 2, 0, 1, 2, 0, 1, 2]
a += [3] # 在a的末尾添加一个新元素3
print(a) # 输出[0, 1, 2, 3]
"""output
[0, 1, 2, 3, 4]
[0, 1, 2, 0, 1, 2, 0, 1, 2]
[0, 1, 2, 3]
"""
七、列表的常用操作
假设 a
是一个列表,则:
表示 | 操作 |
---|---|
len(a) |
返回列表长度 |
a.append(x) |
在列表末尾添加一个新元素 |
a.pop() |
删除列表的最后一个元素 |
a.reverse() |
将整个列表翻转 |
a.sort() |
将整个列表从小到大排序 |
例如:
a = [0, 1, 2]
print(len(a)) # 输出3
a.append(3)
print(a) # 输出[0, 1, 2, 3]
a.pop()
print(a) # 将[0, 1, 2, 3]的最后一个数删掉,所以输出[0, 1, 2]
a.reverse()
print(a) # 输出[2, 1, 0]
a.sort()
print(a) # 输出[0, 1, 2]
八、嵌套列表 (多维列表)
8.1、二维列表的表示
列表中的元素也可以是列表,例如:
matrix = [ # 列表中的元素也可以是列表
[0, 1, 2],
[3, 4, 5],
[6, 7, 8], # 最后一个元素后可以添加逗号
]
8.1、二维列表的输出 (遍历)
二维列表的输出关键就在于找到 下标 和 元素 的对应关系。下面给出两种输出方式 (遍历方式):
matrix[1][0] = 99 # 修改嵌套列表中元素的值
print(matrix[1][0]) # 读取嵌套列表中元素的值
"""先输出行再输出列"""
for i in range(len(matrix)): # 循环打印整个矩阵
for j in range(len(matrix[i])):
print(matrix[i][j], end=' ')
print() # 在行末输出回车
for row in matrix: # 循环打印整个矩阵
for x in row:
print(x, end=' ')
print() # 在行末输出回车
"""先输出列再输出行"""
for j in range(len(matrix[0])):
for i in range(len(matrix):
print(matrix[i][j], end = " ")
print()
8.2、二维列表的初始化
方法一:采用 append()
函数初始化:
matrix = []
for i in range(3):
row = []
for j in range(3):
row.append(i * 3 + j)
matrix.append(row)
print(matrix)
方法二:采用 for
语句直接初始化:
matrix = [[i * 3 + j for j in range(3)] for i in range(3)]
print(matrix)
"""output
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
"""
九、补充
- 当需要读入一行 整数 时,可以用
a = list(map(int, input().split()))
。类似地,当需要读入一行 浮点数 时,可以用a = list(map(float, input().split()))
。 a[::-1]
可以返回一个 逆序的 新列表。
作者:Miyazaki_Hayao