第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。

课堂 Python 解释器
点击“逐步运行”后,这里会显示结果。
Python:按执行步骤显示结果。