Python基础 | 元组、列表与字典

为什么学这三个?它们是编程的「收纳盒三件套」

想象你是奶茶店老板:

  • 元组(tuple):固定套餐(珍珠奶茶 + 椰果,不能改)
  • 列表(list):点单记录(今天卖了 5 杯,随时加单)
  • 字典(dict):会员信息(手机号对应积分,快速查找)

一句话总结:

  • 元组:固定不变的收纳盒(封死的罐头)
  • 列表:可以增减的收纳盒(带拉链的行李箱)
  • 字典:按标签找东西的收纳盒(带索引的抽屉柜)

元组(tuple):封死的「固定套餐」

👉 定义
  • 用小括号(),元素用逗号分隔
固定套餐 = ("珍珠奶茶", "椰果", "七分糖")  # 封死的套餐,定义后下面的代码不能改
👉 特点

✅ 不可变:封死的罐头,不能增删改(防误操作)
✅ 有序:按顺序排列(珍珠奶茶是第 1 项,椰果第 2 项)
❌ 不能单独修改:固定套餐[0] = "芋泥波波" → 报错!

👉 适合场景
  • 固定配置:一周的课程表(周一到周五不变)
  • 防误操作:部门列表(销售部、市场部,不能删)
  • 坐标定位:(x, y) 坐标(改了会影响地图定位)
👉 必学操作
# 1. 访问元素(用索引,从0开始)
print(固定套餐[1])  # 输出:椰果(第2项)

# 2. 拆包赋值(快速提取)
奶茶, 小料, 甜度 = 固定套餐  
print(f"这杯是{奶茶}加{小料},{甜度}")  # 输出:珍珠奶茶加椰果,七分糖

列表(list):能增减的「购物车」

👉 定义
  • 用中括号[],元素可任意改
购物车 = ["面包", "牛奶", "鸡蛋"]  # 随时加零食的购物车
👉 特点

✅ 可变:拉链行李箱,可增删改(买完还能加冰淇淋)
✅ 有序:按放入顺序排列(先放面包,后放牛奶)
✅ 支持重复:["珍珠", "珍珠", "珍珠"] 合法(适合记录多次购买)

👉 适合场景
  • 动态数据:每天的销售记录(随时追加)
  • 临时存储:待办事项(做完一项划掉一项)
  • 批量操作:给 100 个用户发消息(列表循环)
👉 必学操作
# 1. 追加:买完发现漏了酸奶
购物车.append("酸奶")  # 购物车变成:['面包', '牛奶', '鸡蛋', '酸奶']

# 2. 修改:牛奶买错了,换成豆奶
购物车[1] = "豆奶"  # 现在第2项是豆奶

# 3. 插入:在面包前加蛋糕
购物车.insert(0, "蛋糕")  # 购物车:['蛋糕', '面包', '豆奶', ...]

# 4. 删除:鸡蛋不要了
购物车.remove("鸡蛋")  # 或 del 购物车[2]

字典(dict):带标签的「抽屉柜」

👉 定义:用大括号{},键值对形式键: 值
会员 = {
    "13800000000": 1000,  # 手机号: 积分
    "13900000000": 1500,
    "姓名": "豆包"  # 键可以是文字
}
👉 特点

✅ 按标签查找:通过键(手机号)快速找值(积分),比列表快 100 倍
✅ 无序:抽屉柜不按顺序,只认标签(Python 3.7 + 有序,新手可忽略)
❌ 键唯一:重复键会覆盖({"a":1, "a":2} 结果是 {“a”:2})

👉 适合场景
  • 快速查找:学号对应成绩、工号对应部门
  • 结构化数据:用户信息(姓名、年龄、地址)
  • 配置参数:游戏设置(音量: 50,画质: “高清”)
👉 必学操作
# 1. 查积分:用手机号当钥匙
print(会员["13800000000"])  # 输出:1000

# 2. 改信息:豆包改名了
会员["姓名"] = "小明"  # 键"姓名"的值变成"小明"

# 3. 加新会员:新手机号注册
会员["15800000000"] = 0  # 新增键值对

# 4. 遍历:给所有会员发通知
for 手机号, 积分 in 会员.items():
    print(f"尊敬的用户{手机号},您的积分有{积分}分!")

对比表格:3 秒看懂三者区别

特性 元组(tuple) 列表(list) 字典(dict)
定义符号 () [] {键: 值}
是否可变 ❌ 不可变(封死) ✅ 可变(拉链) ✅ 可变(抽屉)
访问方式 索引(位置) 索引(位置) 键(标签)
适合场景 固定配置、防误改 动态数据、批量操作 快速查找、结构化数据
常用方法 拆包、索引 append/insert/remove items()/get()

实战:行政小白的「周报自动化」

场景:汇总 3 个部门周报,自动发邮件

# 1. 固定部门(元组:防删改)
部门 = ("销售部", "市场部", "客服部")  

# 2. 收集数据(列表:动态添加)
周报数据 = []  
for 部门名 in 部门:
    数据 = {"部门": 部门名, "业绩": 1000, "问题": "无"}  # 字典:结构化数据
    周报数据.append(数据)  # 列表收纳每个部门的数据

# 3. 自动发邮件(字典:快速查邮箱)
邮箱 = {
    "销售部": "sales@com",
    "市场部": "mark@com",
    "总经办": "boss@com"  # 额外抄送
}

for 部门名 in 部门:
    邮件内容 = f"{部门名}周报:业绩1000万,问题无"
    收件人 = 邮箱[部门名]  # 按部门名找邮箱
    抄送 = [邮箱["总经办"]]  # 固定抄送领导
    print(f"已发送至{收件人},抄送{抄送}")

运行效果:

  • 部门不可删(元组防误操作)
  • 动态添加新部门(列表 append)
  • 按部门名快速查邮箱(字典键值对)

小白必避的 3 个误区

用列表存固定数据
错误:固定套餐 = ["珍珠", "椰果"]  # 不小心删掉珍珠?  
正确:固定套餐 = ("珍珠", "椰果")  # 封死,防手抖
用字典存顺序数据
错误:购物车 = {"1": "面包", "2": "牛奶"}  # 键是字符串,多余!  
正确:购物车 = ["面包", "牛奶"]  # 列表按顺序,天然索引
用元组存动态数据
错误:销售记录 = ("周一100", "周二200")  # 周三无法追加!  
正确:销售记录 = ["周一100", "周二200"]  # 列表可随时append

口诀:固定用元组,动态用列表,查找用字典

总结:3 个问题选对数据结构

下次遇到数据时,问自己:

  1. 数据会变吗? 不变→元组;会变→列表 / 字典
  2. 需要按顺序访问吗? 是→列表;否→字典
  3. 需要快速查找吗? 是→字典;否→列表

报错急救箱:

  • 元组修改报错:TypeError: 'tuple' object does not support item assignment → 换列表
  • 字典键错误:KeyError: '手机号' → 检查键是否存在(用get()防报错)

← 返回资讯