第五章:数据结构
列表(list)— 万能的收纳箱 📦
列表就像一个有编号的收纳箱,东西可以随时放进去、拿出来、换位置。它是 Python 中最常用的数据结构。
bash
# 创建列表
fruits = ["苹果", "香蕉", "橘子"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", True, 3.14, None] # 可以混合类型
# 访问元素(索引从 0 开始!)
print(fruits[0]) # 第一个元素
print(fruits[-1]) # 最后一个元素
print(fruits[1:3]) # 切片:第2到第3个
# 常用操作
fruits.append("芒果") # 末尾添加
fruits.insert(0, "草莓") # 指定位置插入
fruits.remove("香蕉") # 删除指定元素
popped = fruits.pop() # 取出并删除最后一个
fruits.sort() # 排序
print(f"最终列表:{fruits}")
print(f"列表长度:{len(fruits)}")bash
苹果
橘子
['香蕉', '橘子']
最终列表:['草莓', '橘子', '芒果', '苹果']
列表长度:4bash
# 列表推导式(Python 的"语法糖")
squares = [x ** 2 for x in range(1, 6)]
print(f"平方数:{squares}")
evens = [x for x in range(20) if x % 2 == 0]
print(f"偶数:{evens}")
# 嵌套列表(二维列表)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(f"矩阵第2行第3列:{matrix[1][2]}")bash
平方数:[1, 4, 9, 16, 25]
偶数:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
矩阵第2行第3列:6元组(tuple)— 不可修改的清单 📜
如果列表是收纳箱,那元组就是"封了蜡的信封"——一旦装好就不能修改了。适合存放不应该被改变的数据。
bash
# 创建元组
point = (3, 4)
rgb_color = (255, 128, 0)
single = (42,) # 注意:单元素元组必须加逗号!
# 访问元素
print(f"坐标 x={point[0]}, y={point[1]}")
# 元组解包
x, y = point
print(f"解包后: x={x}, y={y}")
# 尝试修改元组会报错
try:
point[0] = 10
except TypeError as e:
print(f"错误:{e}")
# 元组的妙用:函数返回多个值
def get_min_max(data):
return min(data), max(data)
lo, hi = get_min_max([3, 1, 4, 1, 5, 9])
print(f"最小值={lo}, 最大值={hi}")bash
坐标 x=3, y=4
解包后: x=3, y=4
错误:'tuple' object does not support item assignment
最小值=1, 最大值=9字典(dict)— 电话簿 📒
字典就像一本电话簿:通过名字(键)快速找到电话号码(值)。每个键都是唯一的,查找速度极快。
bash
# 创建字典
student = {
"name": "小明",
"age": 18,
"grades": [85, 92, 78],
"is_active": True
}
# 访问值
print(f"姓名:{student['name']}")
print(f"年龄:{student.get('age', '未知')}") # 用 get 避免 KeyError
print(f"性别:{student.get('gender', '未知')}") # 不存在的键返回默认值
# 增删改
student["email"] = "xiaoming@example.com" # 新增
student["age"] = 19 # 修改
del student["is_active"] # 删除
# 遍历字典
print("\n学生信息:")
for key, value in student.items():
print(f" {key}: {value}")
# 字典推导式
square_map = {x: x**2 for x in range(1, 6)}
print(f"\n平方映射:{square_map}")bash
姓名:小明
年龄:18
性别:未知
学生信息:
name: 小明
age: 19
grades: [85, 92, 78]
email: xiaoming@example.com
平方映射:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}集合(set)— 不重复的抽奖箱 🎰
集合就像一个抽奖箱:每个号码只能出现一次,而且没有顺序。它最擅长做"去重"和"交并差集"运算。
bash
# 创建集合
colors_a = {"红", "蓝", "绿", "黄"}
colors_b = {"蓝", "黄", "紫", "白"}
# 自动去重
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = set(numbers)
print(f"去重结果:{unique}")
# 集合运算
print(f"交集(都有的):{colors_a & colors_b}")
print(f"并集(所有的):{colors_a | colors_b}")
print(f"差集(A独有):{colors_a - colors_b}")
print(f"对称差集(独有的):{colors_a ^ colors_b}")bash
去重结果:{1, 2, 3, 4}
交集(都有的):{'蓝', '黄'}
并集(所有的):{'红', '蓝', '绿', '黄', '紫', '白'}
差集(A独有):{'红', '绿'}
对称差集(独有的):{'红', '绿', '紫', '白'}💡 提示: 集合是无序的,上面的打印顺序只是示例;不同 Python 版本或不同运行次数里,元素显示顺序可能不一样。
| 特性 | 列表 list | 元组 tuple | 字典 dict | 集合 set |
|---|---|---|---|---|
| 符号 | [ ] | ( ) | ||
| 有序 | ✅ 是 | ✅ 是 | ✅ 是(3.7+) | ❌ 否 |
| 可变 | ✅ 是 | ❌ 否 | ✅ 是 | ✅ 是 |
| 可重复 | ✅ 是 | ✅ 是 | 键不可重复 | ❌ 否 |
| 用途 | 有序集合 | 固定数据 | 键值映射 | 去重、集合运算 |