第6讲
组合数据类型
用合适的容器,保存与读取一组数据。
1列表:保存可变的顺序
2元组:保存固定的位置
3字典与集合:按名称取值、去重
一组数据,四种组织方式
1列表 list:有顺序,可以修改
2元组 tuple:有顺序,元素位置不可重新赋值
3字典 dict:通过键找到对应的值
4集合 set:成员不重复,不按索引取值
语法拆解
- ["牛奶", "面包"]
- 列表用方括号
- (120, 30)
- 元组常用圆括号,元素用逗号分隔
- {"姓名": "小林"}
- 字典用冒号连接键和值
- {"Python", "绘画"}
- 集合只列出成员,不写键值对
需要按位置取值、按名称取值,还是只关心成员是否存在?
列表:创建、读取与追加
list_basics.py
items = ["牛奶", "面包"]
print(items[0])
items.append("鸡蛋")
print(items)
print(len(items))- items = ["牛奶", "面包"]
- 把列表赋给变量 items
- items[0]
- 方括号里的整数是索引
- items.append("鸡蛋")
- 点号表示调用这个列表的 append 方法
1元素之间用英文逗号分隔
2索引从 0 开始,items[0] 是第一项
3append() 在列表末尾增加一项
小案例:修改购物清单
shopping.py
items = ["牛奶", "面包"]
items[1] = "酸奶"
items.append("鸡蛋")
print("购物清单:", items)
print("商品种类:", len(items))- items[1] = "酸奶"
- 只替换第二项,其他位置不变
1第二项对应索引 1
2替换一项,再追加一项
3最后核对清单和数量
快练:第二项是什么
list_quiz.py
colors = ["红", "蓝"]
colors.append("绿")
print(colors[1])
print(len(colors))1先预测两行输出
2索引与元素个数不是一回事
3展开答案后,再运行验证
参考答案
colors = ["红", "蓝"]
colors.append("绿")
print(colors[1])
print(len(colors))索引1对应第二项蓝;追加后共3项。
元组:保留固定的位置
tuple_basics.py
point = (120, 30)
print(point[0])
print(point[1])
single = (120,)
print(type(single))- point = (120, 30)
- 两个位置分别保存两个数值
- point[0]
- 读取第一个元素
- single = (120,)
- 单元素元组需要逗号
1用位置读取,索引同样从 0 开始
2不能通过索引给元组元素重新赋值
3只有一个元素时,末尾逗号不能省
小案例:读取固定坐标
coordinate.py
point = (120, 30)
print("横坐标:", point[0])
print("纵坐标:", point[1])1第一个位置表示横坐标
2第二个位置表示纵坐标
3输出时补上标签,避免混淆
清单增删用列表;固定的位置记录可以用元组。
字典:用键找到值
dict_basics.py
student = {"name": "小林", "age": 18}
print(student["name"])
student["age"] = 19
print(student["age"])- {"name": "小林", "age": 18}
- name和age是键,右侧内容是值
- student["name"]
- 通过键读取,不是通过索引位置
- student["age"] = 19
- 更新age对应的值
1键和值之间用英文冒号连接
2键值对之间用英文逗号分隔
3同一个键再次赋值,会更新对应的值
小案例:学生信息卡
student_card.py
student = {"name": "小林", "score": 85}
student["score"] = 90
print("姓名:", student["name"])
print("成绩:", student["score"])
print("社团:", student.get("club", "未填写"))- student.get("club", "未填写")
- 有club键就读取,没有就返回默认值
1读取已有的姓名与成绩
2更新成绩,不创建重复字段
3可选字段用 get() 提供默认值
快练:更新后有几个键
dict_quiz.py
info = {"score": 80}
info["score"] = 95
print(info["score"])
print(info.get("city", "未知"))
print(len(info))1给已有的键再次赋值
2get() 不会创建缺失的键
3预测输出值和字典长度
参考答案
info = {"score": 80}
info["score"] = 95
print(info["score"])
print(info.get("city", "未知"))
print(len(info))score仍是一个键;get读取默认值,不新增city。
集合:只保留不同成员
set_basics.py
names = ["小林", "小周", "小林"]
unique = set(names)
print(len(unique))
print("小林" in unique)- set(names)
- 把列表转换为集合并去重
- "小林" in unique
- 返回成员是否存在的布尔值
- set()
- 创建空集合;{}创建的是空字典
1重复成员只保存一份
2不保证显示顺序,不用索引取值
3用 in 判断成员是否存在
小案例:统计实际报名人数
signup.py
names = ["小林", "小周", "小林", "小陈"]
unique = set(names)
print("报名记录:", len(names))
print("实际人数:", len(unique))
print("重复记录:", len(names) - len(unique))1原列表保留全部报名记录
2集合统计不同报名人
3只比较数量,不依赖集合顺序
快练:给数据选容器
1待办清单:需要不断添加
2固定尺寸:宽度与高度各占一位
3个人信息:按字段名读取
4兴趣名单:只保留不同兴趣
语法拆解
- 列表 / 元组 / 字典 / 集合
- 依据变化方式与读取方式选择
参考答案
tasks = ["预习", "练习"]
size = (1920, 1080)
profile = {"name": "小林"}
hobbies = {"编程", "绘画"}
print(tasks[0], size[0])
print(profile["name"], len(hobbies))清单用列表,尺寸用元组,字段用字典,去重用集合。
课末练习:学习档案整理器
archive.py
# 姓名:小林;年级:初一
# 原任务:预习、练习;追加:复盘
# 固定时段:19、20
# 技能记录:Python、绘画、Python
# 创建四种容器,输出姓名、任务数、时段和技能数1字典保存姓名与年级
2列表保存任务,再追加一项
3元组保存固定的学习时段
4集合统计不重复的技能数量
核对:小林;3项任务;19点至20点;2项不同技能。打开参考前先保存代码。
参考实现:各司其职的四种容器
archive_answer.py
profile = {"name": "小林", "grade": "初一"}
tasks = ["预习", "练习"]
tasks.append("复盘")
period = (19, 20)
skills = set(["Python", "绘画", "Python"])
print("姓名:", profile["name"])
print("任务数:", len(tasks))
print("时段:", period[0], "至", period[1])
print("不同技能:", len(skills))1先创建,再读取或修改
2字典按键读取,元组按位置读取
3列表允许重复,集合统计唯一成员
重复添加Python,技能数仍为2;新增摄影,技能数变为3。
1 / 15