如何将计算机运算的数据临时存入一个地方,同时又方便添加,删除,修改等操作?python 中的列表就很容易实现这一步操作
列表的定义
- 列表是一种容器
- 列表是序列的一种
- 列表是可以被改变的序列
- 列表中由一系列特定元素组成的,元素与元素之间可以没有任何的关联关系,但他们之间有先后顺序关系
创建列表
-
可以直接用 [ ] 创建,如下:
# wxgzh: PyGo学习笔记 # 创建一个空列表 list_empty = [] # 列表内可以装python的任何数据类型,甚至是实例对象,列表的数据也可以是不同种类型 list1 = ['PyGo学习笔记', '在线刷题宝', 1997, 2000] list2 = [1, 2, 3, 4, 5 ] list3 = ["a", "b", "c", "d"]
-
也可以使用列表的构造函数,如下:
# wxgzh: PyGo学习笔记 # 创建一个空列表 list_empty = list() list1 = list("hello") # list1绑定['h', 'e', 'l', 'l', 'o'] list2 = list(range(1, 5, 2)) # list2绑定[1, 3]
列表的索引操作
语法:列表[整数表达式]
-
正向索引:从左往右,下标从0开始
list1 = ['PyGo学习笔记', '在线刷题宝', 1997, 2000] print("list1[0] = ", list1[0]) # 输出结果: list1[0] = PyGo学习笔记 print("list1[1] = ", list1[1]) # 输出结果: list1[1] = 在线刷题宝
-
反向索引:从右往左,下标从-1开始,如下所示:
list1 = ['PyGo学习笔记', '在线刷题宝', 1997, 2000] print(list1[-1], list1[-2]) # 输出结果:1997 2000
-
列表的索引赋值,列表是可变的,可以通过索引赋值改变列表中的元素,如下所示:
list1 = ['PyGo学习笔记', '在线刷题宝', 1997, 2000] list1[0] = "Welcome to the wechat public account:PyGo学习笔记" print(list1) # 结果输出:['Welcome to the wechat public account:PyGo学习笔记', '在线刷题宝', 1997, 2000]
更新列表
-
使用列表的索引赋值,改变列表中的数据,注意,如果索引赋值索引值大于列表最大索引会出现异常,如下:
# 修改已有元素 list1 = ['PyGo学习笔记', '在线刷题宝'] list1[0] = "Welcome to the wechat public account:PyGo学习笔记" print(list1) # 结果输出:['Welcome to the wechat public account:PyGo学习笔记', '在线刷题宝'] # 索引赋值索引值大于列表最大索引会出现异常 list1 = ['PyGo学习笔记'] list1[1] = "在线刷题宝" # 会触发list assignment index out of range 的报错
-
使用列表的append方法追加元素
l = ['PyGo学习笔记'] l.append("在线刷题宝") print(l) # 结果为: ['PyGo学习笔记', '在线刷题宝']
-
使用 del 删除列表元素, del 列表[索引] 或 del 列表[切片] ,如下:
# wxgzh: PyGo学习笔记 L = [1, 2, 3, 4, 5, 6] del L[1] #[1, 3, 4, 5, 6] del L[2] #[1, 3, 5, 6] del L[-1] #[1, 3, 5] L = [1, 2, 3, 4, 5, 6] del L[::2] #[2, 4, 6]
列表的切片
语法:列表[(开始索引b):(结束索引e)(:(步长s))]
- 开始索引是切片开始切下的位置0代表第一个元素,-1代表最后一个元素
- 结束索引是切片的终止索引(但不包含终止索引)
- 步长是切片每次获取完当前索引后移动的方向和偏移量
- 没有步长,相当于取值完成后向后移动一个索引的位置(默认为1)
- 当步长为正整数时,取正向切片: 步长默认值为1, 开始索引默认值为0, 结束索引的默认值为len(s)
- 当步长为负整数时,取反向切片: 反向切片时,默认的起始位置为最后一个元素,默认终止位置为第一个元素的前一个位置
常见示例用法:
x = list(range(10)) # x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(x[1:9:2]) # 输出结果:[1, 3, 5, 7]
print(x[:]) # 输出结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(x[::-1]) # 输出结果: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(x[1: 3]) # 输出结果: [1, 2]
列表的切片赋值
语法: 列表[切片slice] = 可迭代对象
- 可以改变原列表的排列,可以插入数据和修改数据
- 可以用切片改变列表对应的元素的值
示例用法:
L = [2, 3, 4]
L[1:2] = [3.1, 3.2] # L = [2, 3.1, 3.2, 4]
L[:1] = [1.1, 2.2] # L = [1.1, 2.2, 3.1, 3.2, 4]
L = [2, 3, 4]
L[2:] = [] # [2, 3]
L = [2, 3, 4]
L[:0] = [0, 1] # [0, 1, 2, 3, 4]
L = [2, 3, 4]
L[3:] = [5, 6, 7] # [2, 3, 4, 5, 6, 7]
需要特别注意的是:对于步长不等1的切片赋值,赋值运算符的右侧的可迭代对象提供的数据元素的个数一定要等于切片切出的段数,比如:
# wxgzh: PyGo学习笔记
L = [1, 2, 3, 4, 5, 6]
L[::2] = 'ABC' # 正确,L列表会变成:['A', 2, 'B', 4, 'C', 6]
L = [1, 2, 3, 4, 5, 6]
L[::2] = 'ABCDE' # 错误,会触发ValueError: attempt to assign sequence of size 5 to extended slice of size 3 异常
列表的算术运算
-
+ 用于拼接列表
# wxgzh: PyGo学习笔记 x = [1, 2, 3] y = [4, 5, 6] z = x + y # z = [1, 2, 3, 4, 5, 6]
-
+= 用原列表与左侧列表拼接,用变量绑定拼接后的列表
x = [1,2,3] x += [4,5,6] print(x) # 输出结果: [1, 2, 3, 4, 5, 6]
-
* 生成重复的列表
x = [1, 2] * 3 # x = [1,2,1,2,1,2]
-
*= 用原列表重复生成
x = [1, 2] x *= 2 # [1, 2, 1, 2]
列表的比较运算
<(小于) 、 <=(小于等于) 、 >(大于) 、 >=(大于等于)、 ==(等于) 、 != (不等于)
# wxgzh: PyGo学习笔记
l1 = [1, 2, 3]
l2 = [1, 2, 3]
l3 = [1, 2, 4]
print(l1 < l2, l2 < l3) # False True
print(l1 <= l2, l2 <= l3) # False True
print(l1 > l2, l2 > l3) # False False
print(l1 >= l2, l2 >= l3) # True False
print(l1 == l2, l2 == l3) # True False
print(l1 != l2, l2 != l3) # False True
列表的 in / not in 运算符
-
in 判断一个值是否存在于列表中。如果存在返回True, 否则返回False
print(2 in [1, 2, 3, 4]) # True
-
not in 的返回值与 in 运算符相反
print('2' in [1, 2, 3, 4]) # False
列表推导式
列表推导式是用可迭代对象依次生成带有多个元素的列表的表达式
语法: [表达式 for 变量 in 可迭代对象] 或 [表达式 for 变量 in 可迭代对象 if 真值表达式]
# wxgzh: PyGo学习笔记
# 列表推导式生成 1 ~ 50 内奇数的列表
[x for x in range(1, 50, 2)] # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
# 或者
[x for x in range(1, 50) if x % 2] # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
列表推导式的嵌套
语法:[表达式
for 变量1 in 可迭代对象1 if 真值表达式1
for 变量2 in 可迭代对象2 if 真值表达式2
…]
# wxgzh: PyGo学习笔记
# 用字符串"ABC" 和 "123" 生成如下列表: ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
print([x + y for x in "ABC" for y in "123"])
常见列表函数&方法
-
len(list) 返回列表长度
print(len([1, 2, 3])) # 输出结果: 3
-
max(list) 返回列表元素最大值,列表内必须所有数据类型一致,且必须是可比较类型数据,否则会触发 TypeError: ‘>’ not supported between instances of ‘int’ and 'str’异常
print(max([1, 3, 7])) # 输出结果: 3 print(max(["A", "a", "C", "d"])) # 输出结果: d print(max(["a", 2])) # 触发 TypeError: '>' not supported between instances of 'int' and 'str'异常
-
min(list) 返回列表元素最小值,用法跟max一致
-
list.append(obj) 在列表末尾添加新的对象
l = ['PyGo学习笔记'] l.append("在线刷题宝") print(l) # ['PyGo学习笔记', '在线刷题宝'] l.append([1, 2, 3]) print(l) # ['PyGo学习笔记', '在线刷题宝', [1, 2, 3]]
-
list.count(obj) 统计某个元素在列表中出现的次数
l = [1,2,4,1,7] l.count(1) # 2
-
list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
l = [1] l.extend([1, 2, 3]) print(l) # [1, 1, 2, 3] l.extend("ABC") print(l) # [1, 1, 2, 3, 'A', 'B', 'C']
-
list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
l = [7, 8, 7, 9] l.index(7) # 0
-
list.index(index, obj) 将对象插入列表的指定位置
l = [1, 2, 4] l.insert(0, "PyGo学习笔记") print(l) # ['PyGo学习笔记', 1, 2, 4]
-
list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 **空列表会触发 IndexError: pop from empty list 异常 **
l = [1, 2, 3, 4] l.pop() # 4 print(l) # [1, 2, 3] l.pop(0) # 1 print(l) # [2, 3] l = [] l.pop() # 触发 IndexError: pop from empty list 异常
-
list.remove(obj) 移除列表中某个值的第一个匹配项,如果移除的元素不在列表里面会触发 ValueError: list.remove(x): x not in list 异常
l = [1, 1, 2, 3, 4] l.remove(1) print(l) # [1, 2, 3, 4] l.remove(7) # 触发 ValueError: list.remove(x): x not in list 异常
-
list.reverse() 反向列表中元素, 列表为空列表时不会产生异常
l = [1, 2, 3]
l.reverse()
print(l) # [3, 2, 1]
l = []
l.reverse() # 不会产生异常
-
list.sort(key=None, reverse=False) 对原列表进行排序
- key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序
- reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
- 该方法没有返回值,但是会对列表的对象进行排序。
l = ['PyGo学习笔记', '在线刷题宝', "123", "456"] l.sort() print(l) # ['123', '456', 'PyGo学习笔记', '在线刷题宝'] l = [1, 3, 0, 8, 9] l.sort(reverse=True) print(l) # [9, 8, 3, 1, 0] l = [[1, 2], [7, 9], [10, 7], [11, 7]] l.sort(key=lambda x: (x[1], -x[0])) # 优先第二个数字小到大排序,如果第二个数字相等,按第一个数字大到小排序 print(l) # [[1, 2], [11, 7], [10, 7], [7, 9]]