主题色

第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
行号代码白话解释
3max(v)max = 挑最大。把列表里最大的数挑出来,这里是 21
4min(v)min = 挑最小。把列表里最小的数挑出来,这里是 7
5sum(v)sum = 求和。7+11+13+21 = 52
6sum(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]
行号代码白话解释
4mylist.append(num)append = 末尾贴一个。把学号粘到项链最末端。
7mylist.insert(2, ymd)insert = 插队。2 是座位号,原来的元素自动往后挪。
10mylist.extend(courses)extend = 批量扩展。把成绩列表拆开,逐个塞进去。注意和 append 的区别!
12sex = mylist.pop(1)pop(1) = 把索引 1 的元素踢出去,并且把踢掉的东西交还给你。
14mylist[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))
行号代码白话解释
3words = s[:-1].split()两步走:① s[:-1] 砍掉末尾句号;② .split() 按空格拆成单词列表。
4lt = [len(word) for word in words]列表推导式:对每个单词量长度,收集成新列表。
5maxlen = max(lt)在长度列表里找最大值。
6words[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 找位真奇妙。