知识点:列表创建 · 索引切片 · 增删改查 · 排序统计 · 二维列表 · 推导式
想象你是学校图书馆的管理员。图书馆里有很多书,你需要:
在 Python 中,列表(list)就像一个可以随时增删改的书架。今天我们就用列表来实现这个图书管理系统!
[ ] 把所有书名括起来,用逗号隔开,就建好了一个书架!
# 创建一个图书列表,存放图书馆的书籍名称 ``` books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”] # 打印整个书单 print(“图书馆书单:”, books) # 查看列表的数据类型 print(“数据类型:”, type(books))
my_books 的列表,存放你喜欢的 3 本书(可以随意起名)。然后用 print() 打印出来。
-1 表示最后一本书。
books[0] → 第1本 books[1] → 第2本 books[-1] → 最后一本
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` # 索引: 0 1 2 3 # 查看第1本书(索引0) print(“第1本书:”, books[0]) # 查看第3本书(索引2) print(“第3本书:”, books[2]) # 负数索引:-1 表示最后一本 print(“最后一本书:”, books[-1]) # 倒数第二本 print(“倒数第二本书:”, books[-2])
books 列表中的第 2 本书和倒数第 1 本书。
books[开始:结束],取出的范围包含"开始",但不包含"结束"(左闭右开区间)。省略开始或结束则表示从头/到尾。
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` # 取第1到第2本(索引0到1,不含2) print(“前两本书:”, books[0:2]) # 从第2本开始,取到最后 print(“第2本起到最后:”, books[1:]) # 取前3本(省略开始,默认从0) print(“前3本书:”, books[:3]) # 复制整个列表(常用技巧) books_copy = books[:] print(“书单副本:”, books_copy)
books 中间两本书(即索引 1 和 2),打印结果。
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` # ① append:在末尾添加一本新书 books.append(“深度学习入门”) print(“append后:”, books) # ② insert:在索引1的位置插入(其他书向后移) books.insert(1, “算法导论”) print(“insert后:”, books) # ③ extend:把另一批书一次性加进来 new_books = [“计算机网络”, “操作系统原理”] books.extend(new_books) print(“extend后:”, books)
append 向 books 末尾添加 "数据库原理",再用 insert 把 "离散数学" 插到第 0 个位置(最前面),最后打印列表。
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` # ① remove:按书名删除(书丢了,下架) books.remove(“数据科学基础”) print(“remove后:”, books) # ② pop:取出最后一本(默认),返回被删除的书名 removed_book = books.pop() print(“被取出的书:”, removed_book) print(“pop后:”, books) # ③ pop(索引):取出指定位置的书 books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”] books.pop(1) # 取出索引1的书 print(“pop(1)后:”, books) # ④ del:直接删除某个位置 books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”] del books[0] print(“del后:”, books) # ⑤ clear:清空所有书(书架清零) books.clear() print(“clear后:”, books)
books 中用 remove 删除 "人工智能导论",再用 pop(0) 取出第一本书并打印"已取出:xxx",最后打印剩余书单。
books[位置] = 新书名
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` print(“修改前:”, books) # 把第1本书(索引0)更换为新版本 books[0] = “Python编程(第3版)” # 把最后一本书更换 books[-1] = “机器学习实战(第2版)” print(“修改后:”, books)
books[1] 修改为 "人工智能导论(第2版)",打印修改后的列表。
True(在)或 False(不在)。books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` # ① 用 in 查找书是否存在 print(“Python编程 在馆吗?”, “Python编程” in books) print(“高等数学 在馆吗?”, “高等数学” in books) # ② 结合 if 判断,给出提示 search = “数据科学基础” if search in books: print(search, “在馆,可以借阅!”) else: print(search, “不在馆,请联系馆员。”) # ③ len():统计图书总数 total = len(books) print(“图书馆共有”, total, “本书”)
"机器学习实战" 和 "线性代数" 是否在馆,分别打印结果。再用 len() 打印书单总数。
for 书 in 书架: 每次循环,变量 书 自动变成当前那本书。
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` # 基础遍历:打印每本书的名字 print(”=== 图书馆书单 ===”) for book in books: print(” 📖”, book) # 带编号的遍历(enumerate会同时给出序号和值) print(”\n=== 带编号的书单 ===”) for i, book in enumerate(books, 1): # 从1开始编号 print(f” 第{i}本:{book}”) # 查找包含”导论”的书 print(”\n=== 含’导论’的书 ===”) for book in books: if “导论” in book: print(” 找到:”, book)
for 循环遍历 books,找出所有书名长度超过 5 个字的书,并用 len(book) 计算书名长度,打印:"《xxx》书名长度为 N"。
books = ["Python编程", "人工智能导论", "数据科学基础", "机器学习实战"] ``` print(“排序前:”, books) # ① sort():升序排列(直接修改原列表) books.sort() print(“升序排序后:”, books) # ② sort(reverse=True):降序排列 books.sort(reverse=True) print(“降序排序后:”, books) # ③ reverse():仅翻转顺序,不排序 books.reverse() print(“翻转顺序后:”, books) # ④ sorted():不改原列表,返回新的排序列表 books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”] sorted_books = sorted(books) print(“原列表不变:”, books) print(“新排序结果:”, sorted_books)
reverse() 翻转并打印。
# 模拟一份可能有重复录入的书单 ``` books = [“Python编程”, “人工智能导论”, “Python编程”, “数据科学基础”, “机器学习实战”, “Python编程”] # ① count:统计某本书出现次数(检查是否重复录入) cnt = books.count(“Python编程”) print(f”‘Python编程’ 出现了 {cnt} 次”) cnt2 = books.count(“高等数学”) print(f”‘高等数学’ 出现了 {cnt2} 次”) # ② index:找到某本书第一次出现的位置 pos = books.index(“数据科学基础”) print(f”‘数据科学基础’ 在索引 {pos} 位置”) # 注意:查询不存在的书会报错,所以先用 in 判断 query = “机器学习实战” if query in books: print(f”’{query}’ 在第 {books.index(query)} 号位置”)
count 统计 "Python编程" 出现几次,若超过 1 次则打印"警告:重复录入了 N 次";再用 index 找到 "人工智能导论" 的位置并打印。
books[行][列]。
# 二维列表:每个元素是 [书名, 作者, 是否借出] ``` # 结构:books[行索引][列索引] # 列0=书名 列1=作者 列2=是否借出(1借出/0在馆) books = [ [“Python编程”, “Guido”, 0], # 在馆 [“人工智能导论”, “周志华”, 1], # 已借出 [“数据科学基础”, “吴恩达”, 0], # 在馆 [“机器学习实战”, “李沐”, 1], # 已借出 ] # 访问第1本书的书名(行0,列0) print(“第1本书名:”, books[0][0]) # 访问第2本书的作者(行1,列1) print(“第2本作者:”, books[1][1]) # 遍历打印完整书单 print(”\n=== 图书馆完整书单 ===”) print(f”{‘书名’:<12} {‘作者’:<8} {‘状态’}”) print(”-” * 30) for book in books: # book[0]=书名 book[1]=作者 book[2]=是否借出 if book[2] == 1: status = “❌ 已借出” else: status = “✅ 在馆” print(f”{book[0]:<12} {book[1]:<8} {status}”) # 修改借阅状态:把第1本书改为已借出 books[0][2] = 1 print(”\n《Python编程》已借出,状态更新为:”, books[0]) # 添加一本新书到二维列表 books.append([“深度学习”, “Goodfellow”, 0]) print(“新增书籍后,共有”, len(books), “本书”)
for 循环遍历二维列表,只打印状态为"在馆"(第3列为 0)的书籍的书名和作者。
[表达式 for 变量 in 列表 if 条件]
# 图书信息:[书名, 作者, 是否借出(0在馆/1借出)] ``` books = [ [“Python编程”, “Guido”, 0], [“人工智能导论”, “周志华”, 1], [“数据科学基础”, “吴恩达”, 0], [“机器学习实战”, “李沐”, 1], [“深度学习”, “Goodfellow”,0], ] # ① 提取所有书名(一行搞定!) all_titles = [book[0] for book in books] print(“所有书名:”, all_titles) # ② 提取所有在馆的书名(加上条件过滤) available = [book[0] for book in books if book[2] == 0] print(“当前在馆书籍:”, available) # ③ 提取所有已借出的书名 borrowed = [book[0] for book in books if book[2] == 1] print(“已借出书籍:”, borrowed) # ④ 生成一个书名长度列表 title_lengths = [len(book[0]) for book in books] print(“各书名长度:”, title_lengths) # 对比:不用推导式的写法(效果相同,但要4行) # available = [] # for book in books: # if book[2] == 0: # available.append(book[0])
authors,存放所有书籍的作者名;再生成 long_titles,存放书名长度大于 4 的书名。
# ============================================================ ``` # 图书管理系统 —— Python 列表操作完整示例 # 适合大一新生,综合演示列表的所有核心操作 # ============================================================ # ─── 第1步:创建图书列表 ──────────────────────────────────── books = [“Python编程”, “人工智能导论”, “数据科学基础”, “机器学习实战”] print(”【初始书单】”, books) # ─── 第2步:索引访问 ──────────────────────────────────────── print(”\n【索引访问】”) print(“第1本书:”, books[0]) print(“最后一本:”, books[-1]) # ─── 第3步:切片 ──────────────────────────────────────────── print(”\n【切片操作】”) print(“前两本:”, books[:2]) print(“后两本:”, books[2:]) # ─── 第4步:添加书籍 ──────────────────────────────────────── print(”\n【添加书籍】”) books.append(“深度学习入门”) # 末尾加 books.insert(0, “算法导论”) # 开头插 books.extend([“计算机网络”, “操作系统”]) # 批量加 print(“添加后:”, books) # ─── 第5步:删除书籍 ──────────────────────────────────────── print(”\n【删除书籍】”) books.remove(“操作系统”) # 按名删除 last = books.pop() # 弹出最后一本 print(“弹出:”, last) print(“删除后:”, books) # ─── 第6步:修改书籍 ──────────────────────────────────────── print(”\n【修改书籍】”) books[0] = “算法导论(第4版)” print(“修改后:”, books) # ─── 第7步:查询 ──────────────────────────────────────────── print(”\n【查询书籍】”) query = “Python编程” if query in books: print(query, “在馆,位置在索引”, books.index(query)) else: print(query, “不在馆”) print(“当前书籍总数:”, len(books)) # ─── 第8步:遍历展示 ──────────────────────────────────────── print(”\n【全部书单】”) for i, book in enumerate(books, 1): print(f” {i}. {book}”) # ─── 第9步:排序 ──────────────────────────────────────────── print(”\n【排序】”) books.sort() print(“升序排序:”, books) books.sort(reverse=True) print(“降序排序:”, books) # ─── 第10步:统计 ─────────────────────────────────────────── print(”\n【统计】”) test_list = [“Python编程”, “Python编程”, “深度学习”] print(”‘Python编程’出现次数:”, test_list.count(“Python编程”)) # ─── 第11步:二维列表 ─────────────────────────────────────── print(”\n【二维图书信息表】”) lib = [ [“Python编程”, “Guido”, 0], [“人工智能导论”, “周志华”, 1], [“数据科学基础”, “吴恩达”, 0], [“机器学习实战”, “李沐”, 1], ] for b in lib: st = “已借出” if b[2] == 1 else “在馆” print(f” 《{b[0]}》 作者:{b[1]} 状态:{st}”) # ─── 第12步:列表推导式 ───────────────────────────────────── print(”\n【列表推导式】”) available = [b[0] for b in lib if b[2] == 0] print(“在馆书单:”, available) all_authors = [b[1] for b in lib] print(“所有作者:”, all_authors) print(”\n✅ 图书管理系统演示完毕!”)
书单操作综合题:创建一个包含 5 本书的列表,然后:① 用 append 加入第 6 本书;② 用 remove 删除其中一本;③ 用 sort() 排序;④ 用 for 循环带编号地打印完整书单(格式:第N本:书名)。
借书查询系统:给定书单 ["Python编程", "数据结构", "高等数学", "线性代数", "操作系统"],让程序依次查询 "高等数学"、"机器学习"、"操作系统" 是否在馆,每次查询打印:"《书名》✅ 在馆,位置:第N本" 或 "《书名》❌ 不在馆"。提示:用 in 和 index()。
重复录入检查:给定可能有重复的书单 ["Python编程", "数据结构", "Python编程", "高等数学", "数据结构", "Python编程"],用 for 循环遍历,对于每本书用 count() 检查出现次数,若次数 > 1 则打印警告:"《书名》重复录入了N次,请检查!"。(提示:每本书只需警告一次)
切片取书:书单 books = ["算法", "Python", "数学", "英语", "物理", "化学", "生物"],分别用切片取出:① 前 3 本;② 最后 3 本;③ 中间部分(去掉首尾各 2 本);④ 用 [::-1] 将整个书单倒序(步长 -1)并打印。
二维列表统计:使用以下数据:lib = [["Python编程","Guido",0], ["AI导论","周志华",1], ["数学分析","陈纪修",0], ["深度学习","Goodfellow",1], ["统计学","贾俊平",0]]。要求:① 用 for 循环统计在馆书籍数量(第3列为0);② 用推导式提取所有在馆书名放入新列表并打印;③ 打印借出率:借出数/总数 × 100%。
思考题 1 · 列表 vs 变量:为什么管理 100 本书用列表,而不是创建 100 个变量(如 book1 = "...", book2 = "..." ...)?列表相比多个变量有哪些优势?试着列举 3 个理由,结合图书管理的场景说明。
思考题 2 · append vs extend vs insert:三种添加方法有什么区别?如果图书馆一次收到一整批捐赠书(20 本),你会选择哪个方法?如果想把新书放在最显眼的第 1 个位置,该用哪个?对比三种方法的使用场景。
思考题 3 · 系统升级设想:现在的图书管理系统用二维列表存储 [书名, 作者, 是否借出],如果要继续扩展,还想记录:出版年份、ISBN 编号、借书人姓名、借出日期。你会把这些信息加到二维列表的哪个位置(第几列)?访问"第 3 本书的 ISBN"要怎么写?列表越来越长,有什么缺点?(这自然引出了后续学习"字典"的必要性)