Skip to content

第五章:数据结构

列表(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
苹果
橘子
['香蕉', '橘子']
最终列表:['草莓', '橘子', '芒果', '苹果']
列表长度:4
bash
# 列表推导式(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+)❌ 否
可变✅ 是❌ 否✅ 是✅ 是
可重复✅ 是✅ 是键不可重复❌ 否
用途有序集合固定数据键值映射去重、集合运算