科创科普:Python 列表与字典——把一堆数据装进“收纳盒”

Python 列表与字典——把一堆数据装进“收纳盒”

一、为什么需要“装多份”的工具 前面学过变量:一个变量装一个值。name = "小明",装一个名字没问题。可如果全班 45 个人的名字都要记,难道写 45 个变量?变量一多,程序就没法“批量处理”,因为你没法对 name1 到 name45 写一句通用的代码。 Python 给了两个最常用的“收纳盒”: 列表(list):按顺序排队,用位置(下标)取东西,适合“一列同类数据”。 字典(dict):按名字挂牌,用键(key)取东西,适合“一个对象的多个属性”。 把这两个盒子用熟,你就能写出真正干活的程序。

二、列表:有顺序的抽屉 创建与下标: scores = [88, 92, 79, 95] print(scores[0]) # 88,注意下标从 0 开始 print(scores[-1]) # 95,-1 表示最后一个 常用操作: scores.append(100) # 末尾追加,变成 [88,92,79,95,100] scores.insert(1, 60) # 在 1 号位置插入 60 scores.remove(79) # 删掉第一个值为 79 的元素 x = scores.pop() # 弹出末尾元素,x 得到它 print(len(scores)) # 元素个数 print(scores[1:3]) # 切片:从 1 号到 3 号之前,取两个 print(sum(scores)/len(scores)) # 平均值 遍历与筛选: for s in scores: print(s) passed = [] for s in scores: if s >= 60: passed.append(s) 这两段代码是全篇最值钱的模板:先造一个空盒子 passed,再逐个判断、合格的放进去。几乎所有“筛选”“统计”类题目都是这个形状。

三、字典:带标签的格子 字典存的是“键—值”对,键通常用字符串: student = {"姓名": "小明", "语文": 88, "数学": 92, "英语": 79} print(student["数学"]) # 92 student["物理"] = 85 # 新增一项 student["数学"] = 95 # 修改 del student["英语"] # 删除 安全取值,推荐用 get: print(student.get("化学")) # 没有这个键时返回 None,不报错 print(student.get("化学", 0)) # 没有就返回默认值 0 遍历: for k, v in student.items(): print(k, v) for k in student.keys(): # 只拿键 for v in student.values(): # 只拿值 判断键是否存在:if "数学" in student: 一条最重要的规则:字典的键必须唯一,且必须是不可变类型(字符串、数字、元组可以,列表不行)。后写入的同名键会覆盖前面的值。

四、把两个盒子叠起来:真正能用的结构 最实用的写法是“列表里装字典”,一个班就是一张表: stu_list = [ {"姓名": "小明", "语文": 88, "数学": 92}, {"姓名": "小红", "语文": 95, "数学": 78}, {"姓名": "小刚", "语文": 61, "数学": 84}, ] 求每人总分、找最高分: best_name, best_total = "", 0 for s in stu_list: total = s["语文"] + s["数学"] print(s["姓名"], "总分", total) if total > best_total: best_total = total best_name = s["姓名"] print("总分最高:", best_name, best_total) 统计各分数段人数: band = {"优秀": 0, "及格": 0, "不及格": 0} for s in stu_list: total = s["语文"] + s["数学"] if total >= 160: band["优秀"] += 1 elif total >= 120: band["及格"] += 1 else: band["不及格"] += 1 print(band) 这就是一个“计数器字典”:先给每个分类设 0,再按条件加 1。比写一堆 if 判断变量清爽得多。

五、三个高频错误 错误 1:下标越界。列表有 4 个元素,最大下标是 3,写 scores[4] 会报 IndexError。取值前先想清楚“长度减一”。 错误 2:一边遍历一边删。for s in scores: 里执行 scores.remove(...),元素位置会前移,导致漏判。正确做法是新建一个列表装要保留的元素,或者倒着遍历。 错误 3:直接拿不存在的键。print(student["化学"]) 会抛 KeyError 让程序中断;用 get 并给默认值,程序更稳。 还有一个“隐蔽”的坑:a = [1,2,3]; b = a 之后,改 b 会影响 a,因为两个名字指向同一个盒子。想要独立副本,用 b = a.copy() 或 b = list(a)。

六、练习(答案在最后) 1. 用列表装 5 个温度值,输出最高、最低与平均值。 2. 有一个名字列表 ["小明","小红","小刚","小美"],输出每个名字的长度。 3. 用字典记录一本书的书名、作者、价格;把价格打八折后打印整本信息。 4. 统计字符串 "banana" 中每个字母出现的次数(提示:用字典当计数器)。 5. 列表 [3,1,4,1,5,9,2,6] 去重并保持原有顺序,输出新列表(提示:用一个“见过”的空列表或集合)。

参考答案: 1. t = [21,19,25,23,20];print(max(t), min(t), sum(t)/len(t))。 2. for n in names: print(n, len(n))。 3. book = {"书名":"Python入门","作者":"张三","价格":59};book["价格"] = book["价格"] * 0.8;print(book)。 4. cnt = {};for ch in "banana": cnt[ch] = cnt.get(ch, 0) + 1;print(cnt) → {'b':1,'a':3,'n':2}。 5. seen = [];for x in [3,1,4,1,5,9,2,6]: if x not in seen: seen.append(x);print(seen) → [3,1,4,5,9,2,6]。