🐍 列表 — Python 最万能的容器
🕐 预计用时:2-3 小时 | 🎯 今日目标:掌握列表的创建、访问、修改和常用方法
📖 今日目录
1. 什么是列表?
列表(List)就是 Python 的"万能收纳盒"——可以把一堆东西按顺序放进去。
生活中的列表无处不在:
- 购物清单:["苹果", "牛奶", "面包", "鸡蛋"]
- 成绩表:[95, 87, 92, 78, 100]
- 混合数据:["张三", 25, 175.5, True] — 列表里什么类型都能装
列表有三个特点:
- 有序
- 可变
- 可重复
2. 创建列表
📦 直接创建
# 空列表empty = []# 带元素的列表fruits = ["苹果", "香蕉", "橘子"]numbers = [1, 2, 3, 4, 5]mixed = ["hello", 42, 3.14, True] # 可以混合类型print(fruits) # ['苹果', '香蕉', '橘子']print(len(fruits)) # 3 — 列表长度
🏭 用 list() 和 range() 创建
# range 转列表nums = list(range(1, 6))print(nums) # [1, 2, 3, 4, 5]# 字符串转列表(按字符拆分)chars = list("Python")print(chars) # ['P', 'y', 't', 'h', 'o', 'n']# 字符串按分隔符拆分 → 后面会详细讲 split()
🔄 重复创建
# 创建 5 个 0zeros = [0] * 5print(zeros) # [0, 0, 0, 0, 0]# 重复列表pattern = ["A", "B"] * 3print(pattern) # ['A', 'B', 'A', 'B', 'A', 'B']
⚠️ 列表 vs 字符串的区别: 字符串是不可变的(不能修改某个字符) 列表是可变的(可以修改某个元素)
# 字符串不能改s = "hello"# s[0] = "H" # ❌ TypeError!# 列表可以改lst = ['h', 'e', 'l', 'l', 'o']lst[0] = 'H' # ✅print(lst) # ['H', 'e', 'l', 'l', 'o']
3. 索引与切片
列表的索引和切片与字符串完全一样!如果你 Day03 学得好,这部分秒懂。
📍 索引(取单个元素)
colors = ["红", "橙", "黄", "绿", "蓝"]print(colors[0]) # 红 — 第1个(从0开始)print(colors[2]) # 黄 — 第3个print(colors[-1]) # 蓝 — 最后一个print(colors[-2]) # 绿 — 倒数第2个
✂️ 切片(取多个元素)
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]print(nums[2:5]) # [2, 3, 4] — 索引2到4print(nums[:3]) # [0, 1, 2] — 前3个print(nums[7:]) # [7, 8, 9] — 从索引7到末尾print(nums[::2]) # [0, 2, 4, 6, 8] — 每隔一个取print(nums[::-1]) # [9, 8, 7, ...] — 反转列表
💡 切片不会修改原列表,它返回一个新列表。
original = [1, 2, 3, 4, 5]sliced = original[1:3]print(sliced) # [2, 3]print(original) # [1, 2, 3, 4, 5] — 没变!
4. 修改列表元素
✏️ 直接赋值修改
fruits = ["苹果", "香蕉", "橘子"]fruits[1] = "葡萄" # 把第2个换成葡萄print(fruits) # ['苹果', '葡萄', '橘子']# 切片批量修改fruits[0:2] = ["草莓", "西瓜", "芒果"] # 替换前2个,但给了3个print(fruits) # ['草莓', '西瓜', '芒果', '橘子']
➕ 添加元素
fruits = ["苹果", "香蕉"]# 末尾追加fruits.append("橘子")print(fruits) # ['苹果', '香蕉', '橘子']# 指定位置插入fruits.insert(1, "葡萄") # 在索引1的位置插入print(fruits) # ['苹果', '葡萄', '香蕉', '橘子']# 合并另一个列表fruits.extend(["草莓", "西瓜"])print(fruits) # ['苹果', '葡萄', '香蕉', '橘子', '草莓', '西瓜']
➖ 删除元素
fruits = ["苹果", "香蕉", "橘子", "香蕉"]# 按值删除(只删第一个匹配的)fruits.remove("香蕉")print(fruits) # ['苹果', '橘子', '香蕉']# 按索引删除deleted = fruits.pop(1) # 删除索引1的元素,并返回它print(deleted) # 橘子print(fruits) # ['苹果', '香蕉']# 删除最后一个last = fruits.pop()print(last) # 香蕉print(fruits) # ['苹果']# 清空列表fruits.clear()print(fruits) # []
💡 append vs extend 的区别:
a = [1, 2]b = [3, 4]a.append(b) # 把 b 当成一个整体追加print(a) # [1, 2, [3, 4]] — 列表里套列表!a = [1, 2]a.extend(b) # 把 b 的每个元素展开追加print(a) # [1, 2, 3, 4] — 扁平合并
记忆:append = 整个塞进去 | extend = 展开后塞进去
5. 列表常用方法
| | | |
|---|
append(x) | | [1,2].append(3) | |
insert(i, x) | | [1,3].insert(1,2) | |
extend(lst) | | [1,2].extend([3,4]) | |
remove(x) | | [1,2,1].remove(1) | |
pop(i) | | [1,2,3].pop(1) | |
pop() | | [1,2,3].pop() | |
clear() | | [1,2].clear() | |
index(x) | | [10,20,30].index(20) | |
count(x) | | [1,2,1,1].count(1) | |
sort() | | [3,1,2].sort() | |
sort(reverse=True) | | [3,1,2].sort(reverse=True) | |
reverse() | | [1,2,3].reverse() | |
copy() | | [1,2].copy() | |
🔍 排序详解
nums = [5, 2, 8, 1, 9, 3]# 方法1:sort() — 修改原列表nums.sort()print(nums) # [1, 2, 3, 5, 8, 9]# 方法2:sorted() — 返回新列表,不改原列表nums = [5, 2, 8, 1, 9, 3]new_nums = sorted(nums)print(new_nums) # [1, 2, 3, 5, 8, 9]print(nums) # [5, 2, 8, 1, 9, 3] — 没变!# 降序nums.sort(reverse=True)print(nums) # [9, 8, 5, 3, 2, 1]
💡 sort() vs sorted():sort() = 原地修改,返回 None("我把自己的房间整理了") sorted() = 返回新列表,原列表不变("我复制了一份整理好的") 字符串也能排序:sorted("python") → ['h', 'n', 'o', 'p', 't', 'y']
6. 列表运算
➕ 拼接
a = [1, 2, 3]b = [4, 5, 6]c = a + bprint(c) # [1, 2, 3, 4, 5, 6]
✖️ 重复
pattern = ["Ha"] * 3print(pattern) # ['Ha', 'Ha', 'Ha']
🔍 成员判断
fruits = ["苹果", "香蕉", "橘子"]print("苹果" in fruits) # Trueprint("葡萄" in fruits) # Falseprint("葡萄" not in fruits) # True
📊 常用内置函数
nums = [3, 1, 4, 1, 5, 9, 2, 6]print(len(nums)) # 8 — 长度print(max(nums)) # 9 — 最大值print(min(nums)) # 1 — 最小值print(sum(nums)) # 31 — 总和
7. 列表推导式
列表推导式是 Python 的"一行创建列表"语法,简洁又优雅。
📐 基本语法
# 传统写法squares = []for i in range(1, 6): squares.append(i ** 2)# 列表推导式(一行搞定)squares = [i ** 2 for i in range(1, 6)]print(squares) # [1, 4, 9, 16, 25]
🎯 带条件的推导式
# 取偶数evens = [i for i in range(1, 21) if i % 2 == 0]print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]# 字符串处理words = ["hello", "world", "python"]upper = [w.upper() for w in words]print(upper) # ['HELLO', 'WORLD', 'PYTHON']# 带 if-elselabels = ["正" if x > 0 else "负" if x < 0 else "零" for x in [-3, 0, 5, -1]]print(labels) # ['负', '零', '正', '负']
💡 推导式 vs 循环: 简单操作 → 推导式更简洁 复杂逻辑 → 普通循环更清晰 别为了"一行"牺牲可读性。
8. 实战项目
🏋️ 实战 1:成绩统计系统
scores = []print("=== 成绩录入系统 ===")print("输入 -1 结束录入")while True: score = float(input("请输入成绩:")) if score == -1: break if 0 <= score <= 100: scores.append(score) print(f"已录入,当前共 {len(scores)} 条成绩") else: print("成绩必须在 0-100 之间!")if len(scores) > 0: print(f"\n=== 统计结果 ===") print(f"人数:{len(scores)}") print(f"最高分:{max(scores)}") print(f"最低分:{min(scores)}") print(f"平均分:{sum(scores)/len(scores):.1f}") print(f"及格人数:{len([s for s in scores if s >= 60])}") print(f"优秀人数(≥90):{len([s for s in scores if s >= 90])}")else: print("没有录入任何成绩")
🏋️ 实战 2:购物车
cart = []print("=== Python 购物车 ===")while True: print("\n1. 添加商品") print("2. 查看购物车") print("3. 删除商品") print("4. 结算") print("0. 退出") choice = input("请选择:") if choice == "1": name = input("商品名称:") price = float(input("商品价格:")) cart.append({"name": name, "price": price}) print(f"✅ {name} 已添加到购物车") elif choice == "2": if cart: print("\n--- 购物车 ---") for i, item in enumerate(cart, 1): print(f"{i}. {item['name']} - ¥{item['price']}") print(f"共 {len(cart)} 件商品,总计 ¥{sum(item['price'] for item in cart)}") else: print("购物车是空的") elif choice == "3": if cart: for i, item in enumerate(cart, 1): print(f"{i}. {item['name']} - ¥{item['price']}") idx = int(input("删除第几个?")) - 1 if 0 <= idx < len(cart): removed = cart.pop(idx) print(f"已删除 {removed['name']}") else: print("购物车是空的") elif choice == "4": total = sum(item['price'] for item in cart) print(f"总计:¥{total}") print("感谢购买!") cart.clear() break elif choice == "0": print("再见!") break else: print("无效选择")
🏋️ 练习题
练习 1:创建一个列表 [1,2,3,4,5,6,7,8,9,10],用切片取出:前3个、后3个、偶数位元素、反转。
练习 2:写一个去重程序——输入一个列表,输出去重后的列表(保持原顺序)。例如 [1,2,3,2,1] → [1,2,3]。
练习 3:用列表推导式生成 1~100 中所有能被 3 整除但不能被 5 整除的数。
练习 4:写一个程序,输入两个列表,输出它们的交集(共同元素)。例如 [1,2,3,4] 和 [3,4,5,6] → [3,4]。
9. 今日小结
| |
|---|
| [] |
| 和字符串一样,lst[0]、lst[1:3]、lst[::-1] |
| append(末尾)、insert(指定位置)、extend(合并) |
| remove |
| sort() |
| [表达式 for 变量 in 可迭代对象 if 条件] |
| |
🧠 自检清单
⬜ 能创建列表并访问索引/切片
⬜ 能用 append/insert/extend 添加元素
⬜ 能用 remove/pop 删除元素
⬜ 知道 sort() 和 sorted() 的区别
⬜ 能用列表推导式创建列表
⬜ 能用 in 判断元素是否存在
🎯 Day 9 预告
明天学习元组(Tuple)和集合(Set)——列表的两个"亲戚",各有特色。
元组是"不可修改的列表",集合是"自动去重的容器"。📦
📅 Day 8 完成!列表是 Python 最常用的数据结构,一定要多练。明天见! 🚀