第7章 列表与元组
统计函数、增删改查、列表推导式 —— 列表就像一个多功能收纳盒
课前热身:列表是什么?
列表(list) 就像一个多功能收纳盒:
- 东西可以随便塞(
append/extend/insert) - 不喜欢可以扔掉(
pop/remove) - 还能重新排队(
sort/reverse) - 盒子里能混装各种类型:数字、字符串、甚至另一个列表
而 元组(tuple) 则像一个密封罐:装好东西后就不能改了,适合存放固定不变的信息。
| 特性 | 列表 [] | 元组 () |
|---|---|---|
| 能否修改 | 能 | 不能 |
| 创建方式 | [1, 2, 3] | (1, 2, 3) |
| 记忆口诀 | 活页本 | 精装书 |
7-1 列表统计练习
题目:已知 v = [7, 11, 13, 21],用统计函数求最大值、最小值、总和、平均值(保留两位小数)。
v = [7, 11, 13, 21]
print(max(v)) # 21
print(min(v)) # 7
print(sum(v)) # 52
print("{:.2f}".format(sum(v)/len(v))) # 13.00
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 3 | max(v) | max = 挑最大。把列表里最大的数挑出来,这里是 21。 |
| 4 | min(v) | min = 挑最小。把列表里最小的数挑出来,这里是 7。 |
| 5 | sum(v) | sum = 求和。7+11+13+21 = 52。 |
| 6 | sum(v)/len(v) | len(v) 数一下有几项(4 项);总和除以个数得平均值 13.0。 |
| 6 | "{:.2f}".format(...) | 把平均值格式化成保留两位小数的字符串,输出 13.00。 |
四大统计函数速查:
max找大、min找小、sum求和、len数宝。
7-2 列表元素的增删与访问
题目:对 mylist = ["张红", "女", "计算机"] 依次完成:插学号、插生日、加成绩、删性别,最后格式化输出。
mylist = ["张红", "女", "计算机"]
num = input() # 输入学号 1001
mylist.append(num) # ① 添加在专业后
ymd = eval(input()) # 输入年月日 [2001,9,30]
mylist.insert(2, ymd) # ② 添加在性别后
courses = eval(input()) # 输入三门课成绩 [90,82,76]
mylist.extend(courses) # ③ 添加在列表末尾
sex = mylist.pop(1) # ④ 删除性别,并保存性别
print("{}:性别{}、今年{}岁、学号{}、体育{}分。".format(
mylist[0], sex, 2023 - ymd[0], mylist[3], mylist[-1]))
列表变化全过程:
| 步骤 | 操作 | 列表变成 |
|---|---|---|
| 初始 | — | ["张红", "女", "计算机"] |
| ① | append(num) | ["张红", "女", "计算机", "1001"] |
| ② | insert(2, ymd) | ["张红", "女", [2001,9,30], "计算机", "1001"] |
| ③ | extend(courses) | [..., 90, 82, 76] |
| ④ | pop(1) | ["张红", [2001,9,30], "计算机", "1001", 90, 82, 76] |
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 4 | mylist.append(num) | append = 末尾贴一个。把学号粘到项链最末端。 |
| 7 | mylist.insert(2, ymd) | insert = 插队。2 是座位号,原来的元素自动往后挪。 |
| 10 | mylist.extend(courses) | extend = 批量扩展。把成绩列表拆开,逐个塞进去。注意和 append 的区别! |
| 12 | sex = mylist.pop(1) | pop(1) = 把索引 1 的元素踢出去,并且把踢掉的东西交还给你。 |
| 14 | mylist[0] / mylist[3] / mylist[-1] | 用索引取元素:0 是姓名,3 是学号,-1 是倒数第一个(体育成绩)。 |
append vs extend 关键区别:
append把整个对象当一颗珠子塞进去;extend拆开对象,逐个塞进去。
7-3 最长单词
题目:输入一句英文句子,求最长单词及其长度。句子末尾的句号 . 不算在最后一个单词内。
s = input()
words = s[:-1].split() # 生成各单词组成的列表
lt = [len(word) for word in words] # 生成各单词长度的列表
maxlen = max(lt) # 求最大的长度
maxword = words[lt.index(maxlen)] # 找到最大长度对应的第一个单词
print("最长单词是{},长度是{}。".format(maxword, maxlen))
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 3 | words = s[:-1].split() | 两步走:① s[:-1] 砍掉末尾句号;② .split() 按空格拆成单词列表。 |
| 4 | lt = [len(word) for word in words] | 列表推导式:对每个单词量长度,收集成新列表。 |
| 5 | maxlen = max(lt) | 在长度列表里找最大值。 |
| 6 | words[lt.index(maxlen)] | index 找座位:lt.index(maxlen) 返回最大长度第一次出现的位置,再去 words 里取对应单词。 |
执行图解:
输入:Chinese Museums Association Committee of Museums along the Silk Road.
s[:-1] → "Chinese Museums ... Road"
split() → ['Chinese','Museums','Association','Committee','of','Museums','along','the','Silk','Road']
lt → [7, 7, 11, 9, 2, 7, 5, 3, 4, 4]
maxlen → 11
index(11) → 2
words[2] → 'Association'
为什么用
s[:-1]而不是replace('.', '')? 因为s[:-1]只砍掉最后一个字符(末尾句号),精准;replace会误伤句中其他句点(如Dr.)。
附录:列表核心方法口诀
append 末尾贴一个,extend 批量往里塞;
insert 插队指定座,pop 踢人还退货;
remove 按名删首个,sort 排队 reverse 倒;
max 找大 min 找小,sum 求和 len 数宝;
split 拆句变列表,index 找位真奇妙。