Python 第 12、13 节课 - 元组和列表
- 第 94 篇 -
Date: 2025 - 04 - 26
Author: 郑龙浩/仟墨
【Python 在校课堂笔记】
Python 第 12、13 节课 - 元组和列表
上课时间:
2025-04-21(12)
2025-04-24(13)
文章目录
- Python 第 12、13 节课 - 元组和列表
- 一 元组
- 1 元组的创建方法
- ① 全部存储整数
- ② 每个元素可以存储不同的类型的数据
- ③ 元组中嵌套元组
- ④ 元组中嵌套 元组、列表…
- ⑤ 括号可以省略
- ⑥ 单元素元组必须加逗号
- 2 tuple 与 元组 搭配使用
- ① 可以计算某序列的元素个数
- ② 将字符串中的每个字符拆分并存储到“元组”中,每个字符分别为元组中的单个的元素
- ③ 还可以将列表转换为元组
- 3 count 的使用
- ① 元素全不都是一个类型
- ② 有一个元素是元组,该元组中又有一个 `2` 的元素,在对 `2` 计数的时候,不算内部的元组中的元素
- 4 `t.index(n)` 查找n,返回第一个`t` 的索引
- ① 如果找到了
- ② 如果找不到
- ③ `index(n1, n2)` 可以设置查找的开始索引
- 二 多变量赋值
- ① 正常
- ② 报错情况
- ③ 使用 `*` 一一匹配
- 三 列表
- 1 列表的创建
- 2 使用split分割输入的字符串
- 3 修改某个元素
- ① 用中括号访问某个元素,不越界
- ② 用中括号访问某个元素,越界访问 –> 报错
- 4 `l1.append(n) ` 追加
- 5 `l1.extend(l2) ` 合并
- 6 `l1.insert(n, x)` 插入
- 7 `l1.pop(n)` 删除
- 8 `l1.remove(num)` 移除
- 9 `l1.clear()` 清除
- 10 `l1.sort()` 排序
- ① 默认排序 – 不写参数
- ② 指定关键词
- ③ 逆序排序
- 11 `l1.reverse()` 倒置
- 12 例题
- 四 二维列表
- 1 取某个元素
- 2 循环遍历元素
- 五 推导式
- 1 将循环中的元素存入列表中
- 2 将循环中符合条件的元素存入列表中
- ① 只有 `if` 的情况
- ② 带有 `if - else` 的情况
一 元组
- 用括号来表示元组的数据
- 只能读出,不可修改
- 每个元素的类型可以不同
- 但是如果 元组 中嵌套了 列表之类的可变的类型, 嵌套的这个列表是可以改变的
1 元组的创建方法
① 全部存储整数
t1 = (1, 2, 3, 4) # 等于 t1 = 1, 2, 3, 4
print (t1)# 打印
(1, 2, 3, 4)
② 每个元素可以存储不同的类型的数据
t2 = (1, '23', 4.5)
print (t2)
print (len(t2))# 打印
(1, '23', 4.5)
3
③ 元组中嵌套元组
t2 = (1, '23', 4.5, (1, 2, "dada"))
print (t2)
print (len(t2))# 打印
(1, '23', 4.5, (1, 2, 'dada'))
4
④ 元组中嵌套 元组、列表…
t3 = (1, '23', 4.5, (1, 2, "dada"), [1, 2, 3])
print (t3)
print (len(t3))# 打印结果
(1, '23', 4.5, (1, 2, 'dada'), [1, 2, 3])
5
⑤ 括号可以省略
t1 = 1, 2, 3, 4# 等于 t1 = (1, 2, 3, 4)
print (t1)# 打印
(1, 2, 3, 4)
⑥ 单元素元组必须加逗号
在创建单元素元组的时候,即使是有括号,也必须要加
','
,否则会被识别为普通变量
l1 = (1,) # 单元素元组
l2 = (1) # 会识别为 int 的 1,而不是只有元素 1 的元组
print (l1)
print (l2)# 打印结果
(1,)
1
2 tuple 与 元组 搭配使用
tuple
可以接受 认可可迭代对象比如:字符串,列表,range等等
① 可以计算某序列的元素个数
print (tuple(range(5)))
# 打印
(0, 1, 2, 3, 4)
② 将字符串中的每个字符拆分并存储到“元组”中,每个字符分别为元组中的单个的元素
t4 = ('Python') # 这里'Python'并不是元组中的某个元素,而t4中存储的也不是元组,而本来就是字符串,也就相当于这里的括号没有“元组作用”
t5 = tuple('Python')
print (t4)
print (t5)
# 打印
Python
('P', 'y', 't', 'h', 'o', 'n')
③ 还可以将列表转换为元组
之前就在想既然字符串可以转换为元组,那么列表可不可以用这个转换为元组呢???
可以
print(tuple([1, 2, 3, 4]))
# 打印
(1, 2, 3, 4)
3 count 的使用
只统计顶层元素,不会查找嵌套的元组
比如,在元组中嵌套元组,在查找外层元组的元素的时候,不会查找内部元组的元素,也就是内部元组的元素不会包括在内
t.count(n)
返回
n
在某序列t
中的个数
n
可以是一个值,也可以是一组值
① 元素全不都是一个类型
t = (1, 2, 3, 2)
print (t.count(2))# 打印
2
② 有一个元素是元组,该元组中又有一个 2
的元素,在对 2
计数的时候,不算内部的元组中的元素
也就是统计2的时候,(2, 3) 是当作了另一个元组来匹配的,并不是元素 2
t2 = (1, 2, 2, (2, 3), 4, 5, 6, 7)
print (t2.count(2))# 打印
2 # 答案不是3, 元组中的元组中的 2 不算在内
4 t.index(n)
查找n,返回第一个t
的索引
① 如果找到了
t = (1, 2, 2, 3, 4)
print (t.index(2))# 打印
1
② 如果找不到
t = (1, 2, 2, 3, 4, 6, 7)
print (t.index(5))# 报错
③ index(n1, n2)
可以设置查找的开始索引
n1
是要查找的值n2
是起始的索引
t = (1, 2, 3, 6, 4, 6)
print(t.index(6, 2)) # 从索引 2 开始找 6,返回 索引 3
二 多变量赋值
① 正常
x, y = (5, 10)
m, n = 3, 4
a, b, c = 'xyz' # 对于字符串来说,会将字符自动拆开,分配给a, b, c
print (x, y, m, n, a, b, c, end = ' ')# 打印
5 10 3 4 x y z
② 报错情况
a2, b2, c2 = 'xyzk' # 报错 因为不可以一一匹配,四个字符不可以给三个变量
③ 使用 *
一一匹配
会自动匹配
但是多的元素匹配的是列表
*a, b, c = 'xyzk'
a2, *b2, c2 = 'xyzk'
a3, b3, *c3 = 'xyzk'
print (a, b, c, end = ' ')
print()
print (a2, b2, c2, end = ' ')
print()
print (a3, b3, c3, end = ' ')# 打印
['x', 'y'] z k
x ['y', 'z'] k
x y ['z', 'k']
三 列表
用中括号
[]
每个元素的类型可以不同
列表可读可改,元组只可读,不可改
list
只能接受 1 个可迭代对象,也就是list
中只能写1个string 或 1个列表 或 1个元组
# 代码举例 l1 = list((1, 2, 3)) l2 = list([1, 2, 3]) l3 = list('123') print (l1,l2,l3, end = ' ')# 打印结果 [1, 2, 3] [1, 2, 3] ['1', '2', '3']
1 列表的创建
list()
参数为空的时候,生成的空列表
l1 = [1, 2, 3, 4, 5]
l2 = list() # --> 空列表
# l3 = list(1, 2, 3, 4, 5, 6) # 错误
l4 = list('abc123')
print (l1)
print (l2)
print (l4)
# 打印
[1, 2, 3, 4, 5]
[]
['a', 'b', 'c', '1', '2', '3']
l3 = list(1, 2, 3, 4, 5, 6) # 报错
2 使用split分割输入的字符串
split()
默认按照 任意空白字符(空格、\t、\n等) 分割
s = 'Life is short, you need python'
s2 = s = "Life\tis\nshort"
print (s.split()) # 可以按照多个空格,\t 等进行分隔
print (s.split(' ')) # 只能按照单个空格进行分隔
print (s2.split())# 打印
['Life', 'is', 'short,', 'you', 'need', 'python']
['Life', 'is', 'short,', 'you', 'need', '', '', 'python']
['Life', 'is', 'short']
3 修改某个元素
① 用中括号访问某个元素,不越界
l1 = [1, 2, 3, 4, 5]
print (l1[0]) # 打印1
② 用中括号访问某个元素,越界访问 –> 报错
l1 = [1, 2, 3, 4, 5]
print (l1[5]) # 越界访问,会报错
4 l1.append(n)
追加
- 在 列表 的末尾,追加元素
- 只能追加一个元素,如果追加多个元素,一定报错
l1 = [1, 2, 3, 4, 5]
l1.append(6)
print (l1)# 打印
[1, 2, 3, 4, 5, 6]
5 l1.extend(l2)
合并
将列表
l2
合并在l1
的后边
l1 = [1, 2, 3, 4, 5]
l2 = ['a', 'b', 'c', 'd', 'e']
l1.extend(l2)
print (l1)# 打印
[1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e']
6 l1.insert(n, x)
插入
l1
列表中,在索引n
的前边插入元素x
l1 = [1, 2, 3, 4, 5]
l1.insert(1, 9)
print (l1)# 打印
[1, 9, 2, 3, 4, 5]
l1 = [1, 2, 3, 4, 5]
l1.insert(5, 6)
print (l1)# 打印
[1, 2, 3, 4, 5, 6]
7 l1.pop(n)
删除
删除索引为
n
的元素
l1 = [1, 2, 3, 4, 5]
l1.pop(0) # 删除索引为0的元素l2 = [1, 2, 3, 4, 5]
l2.pop() # 删除最后一个元素
8 l1.remove(num)
移除
参数num
为 int 数值意思是从 列表
l1
中移除num
如果有列表中有相同的元素,则只移除第一个
l = [1, 2, 3, 2]
l.remove(2) # 只移除第一个 2# 打印
[1, 3, 2]
9 l1.clear()
清除
清楚列表中的所有元素
l1 = [1, 2, 3, 4, 5]
l1.clear(0) # 删除全部
print (l1)# 打印
[]
10 l1.sort()
排序
默认排序顺序: 从小到大
排序的时候,会对列表中的所有数据在原地进行排序 –> 人话就是,排序会对自身数据进行改变,而不是返回一个排序后的列表
排序的列表中的元素必须是 同一类型 的
(特殊:
int float
,可以在同一列表中进行排序 )排序规则:
aa
① 默认排序 – 不写参数
l1 = [23, 45, 11, 46, 9]
l2 = ['专业', '222222222', '姓名', '100']
l3 = ['123', 45]
l1.sort()
l2.sort()
l3.sort() # 报错# 打印
[9, 11, 23, 45, 46]
['100', '222222222', '专业', '姓名']
② 指定关键词
l4 = ['abdfa', 'Aeffds', 'ff', 'Baa']
l4.sort(key = str.upper) # 将所有小写字母按照大写字母来排序l5 = ['20258', '455', '856', '86']
l5.sort(key = int) # 将字符数字按照 int 形式来排序# 将字符数字按照 int 形式来排序l6 = ['20258', '455', '856666666666', '86']
l6.sort(key = len)# 将字符数字按照 长度 大小来排序print (l4)
print (l5)
print (l6)# 打印['abdfa', 'Aeffds', 'Baa', 'ff']
['86', '455', '856', '20258']
['86', '455', '20258', '856666666666']
③ 逆序排序
reverse
指定排序顺序,若是 True 表示的是从大到小排序- 原地逆置,不会返回新列表:
l1 = [23, 45, 11, 46, 9]
l1.sort(key = int, reverse = True)print (l1)# 打印
[46, 45, 23, 11, 9]
11 l1.reverse()
倒置
- 作用是将列表中的元素全部倒置过来
l1.reverse()
会改变原来列表中的元素
l1 = [23, 45, 11, 46, 9]
l1.reverse()# 打印
[9, 46, 11, 45, 23]
12 例题
有 10 名同学的78Python课程成绩分别为: 94, 89, 96, 88, 92, 86, 69, 95,78, 85 利用列表分析成绩
输出 平均值,最高的三个成绩i,最低的三个成绩, 成绩中位数
l1 = [94, 89, 96, 88, 92, 86, 69, 95, 78, 85]
l1.sort()
avg = sum(l1) / len(l1)
print ('平均值为:', avg)
print ('最高的三个成绩为:', l1[-1:-4:-1])
print ('最低的三个成绩为为:', l1[0:3])
l1len = len(l1) # 存放长度
t = l1len // 2 # 中间的索引(长度为奇数) 或 中间两个索引的右边那个(长度为偶数)
if l1len % 2: # 如果长度为奇数, 直接打印中间的那个值print ('中位数为:', l1[t])
else: # 如果长度为偶数,取中间两个数的和再除以2print ('中位数为:', (l1[t] + l1[t - 1]) / 2)
四 二维列表
在二维列表中,如果要取某个元素的话,要写两对中括号,第一对表示的是 行, 第二对表示的是 列
1 取某个元素
l1 = [
["张三", "001", 85],
["李四", "002", 92],
["王五", "003", 78],
["赵六", "004", 88]
]
print (l1[0][2]) # 0行2列 的元素
print (l1[1][1]) # 1行1列 的元素
print (l1[2][0]) # 2行0列 的元素
2 循环遍历元素
for arr in l1:print(arr[0], arr[1], arr[2]) # 打印姓名 学号 成绩
l1 = [
["张三", "001", 85],
["李四", "002", 92],
["王五", "003", 78],
["赵六", "004", 88]
]
for i in range(0, 4):for j in range(0, 3):print (l1[i][j], end = ' ')print ()
# 打印结果
张三 001 85
李四 002 92
王五 003 78
赵六 004 88
五 推导式
又名 解析式
从一个序列构建另一个新序列
集成了变换和筛选功能
1 将循环中的元素存入列表中
# [表达式(含有循环要产生的变量) for 变量 in 可迭代对象]
l1 = [a for a in range(5)] # 0 ~ 4 的数字,存入列表中
l2 = [a * 2 for a in range(5)] # 0 ~ 4 之间的数 * 2,存入列表中
l3 = [x * y for x in range(3) for y in range(3)] # 可以写两个循环
l4 = [(x, y) for x in range(3) for y in range(3)]
print (l1)
print (l2)
print (l3)
print (l4)# 打印结果
[0, 1, 2, 3, 4]
[0, 2, 4, 6, 8]
[0, 0, 0, 0, 1, 2, 0, 2, 4]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
2 将循环中符合条件的元素存入列表中
- 在循环后边可以写条件
- 只会将符合条件的元素存入列表,不符合条件的元素不会存入列表
① 只有 if
的情况
偶数存入列表
模板
[表达式(含有循环要产生的变量) for 变量 in 可迭代对象 if 条件表达式]
实现
l5 = [a for a in range(10) if a % 2 == 0] # 0 ~ 10 之间 且 是偶数的值 存入列表中
print (l5)# 打印结果
[0, 2, 4, 6, 8]
② 带有 if - else
的情况
偶数存列表,奇数变负数
模板
[表达式1 if 条件 else 表达式2 for 变量 in 可迭代对象]
实现
l2 = [x if x % 2 == 0 else -x for x in range(10)]
print(l2)# 打印结果
[0, -1, 2, -3, 4, -5, 6, -7, 8, -9]