Dict 字典 Tutorial 1¶
2025-11-25更新
上次课我们用 2维 List 进行成绩合并,非常不便。这次课我们引用一种更合适的复合型数据类型, 可以更好的处理复杂数据结构,查找复杂度为 O(1)。 本讲义只涉及最核心概念,更多的 dict 方法,见 tutorial 2。
难度: 1
时长: 45 min
Dict 概念¶
Dict 是开发稍微复杂一点程序的基础性数据结构。
字典以 键:值 对的形式的数据值,类似于《新华字典》
字典是一个有序的、可更改、且 key不允许重复的集合。
dict = {key: value, key2: value, ...}

Dict 基础¶
字典成员 (Dictionary Items)¶
字典成员 以 Key:Value (键:值) 对的形式呈现,可通过键名进行引用。预测每个 print 的输出。
thisdict = {
"brand": "Ford",
"year": 1960
}
print(thisdict)
print(thisdict["brand"])
[problem 1] 将下面的列表数据改写转换成 dict 数据
# 语文老师提供
chinese_scores = [["张三", "S001", 85], ["李四", "S002", 92], ["王五", "S003", 78]]
# 数学老师提供
math_scores = [["张三", "S001", 90], ["李四", "S002", 87], ["王五", "S003", 85]]
# 英语老师提供
english_scores = [["S001", "张三", 88], ["S002", "李四", 85], ["S003", "王五", 80]]
以学号为 key 建立字典
# 问题1解决方案
# 列表1转换
chinese_dict = {item[1]: ... for item in chinese_scores} # 学号:分数
math_dict = {...: item[2] for item in math_scores}
english_dict = {...: ... for item in english_scores}
[problem 2] 将下面的列表数据改写转换成 dict 数据
[
["学号", "姓名", "语文", "数学", "英语"],
["S001", "张三", 85, 90, 88],
["S002", "李四", 92, 87, 85],
["S003", "王五", 78, 85, 80]
]
使用下面的字典结构转换
# 建议说明这种嵌套字典的优势
students_data = {
"S001": {"姓名": "张三", "语文": 85, "数学": 90, "英语": 88},
# ... 便于按学号快速查找学生所有信息
}
补全 ... 处的代码:
# 列表2转换(更实用的结构)
students_data = {}
headers = data[0] # ["学号", "姓名", "语文", "数学", "英语"]
for row in data[1:]:
student_id = row[0]
students_data[student_id] = {
"姓名": row[1], //
... : row[2], //
"数学": ..., //
... : ... //
}
顺序性¶
thisdict["model"] = "Mustang"
print(thisdict)
Ordered or Unordered?
Python Dict 有序但又无序,Unordered: 不能按 index 访问成员。Ordered: 新增加成员,不会改变成员的顺序。[1]
有序:保持插入顺序(Python 3.7+)
无序:不能通过数字索引访问
可更改 (Changeable)¶
字典是可更改的,这意味着我们可以在创建字典后更改、添加或删除项目。
thisdict["year"] = 1964
print(thisdict)
不允许重复(Duplicates Not Allowed)¶
thisdict = {
"brand": "Ford",
"model": "Mustang",
"year": 1964,
"year": 2020 # 重复的 key
}
print(thisdict)
规则: 根据顺序性和可写性,所以后面的定义覆盖前面的定义。
Updating Existing Keys¶
dict['new-key'] = value
dict['new-key'] = new_value
Dict Length¶
print(len(thisdict))
Dict value type¶
thisdict = {
"brand": "Ford",
"electric": False,
"year": 1964,
"colors": ["red", "white", "blue"] #/// value compound type
}
重要概念:
字典的key必须是不可变类型(字符串、数字、元组)
字典的value可以是任意类型
[problem03]
# 给定初始字典
student = {"name": "zhang", "id": 103, "score": 85}
# 1. 添加新键值对:添加 "class": "A班"
# 2. 修改值:将score改为90
# 3. 删除键:删除score键
# 4. 检查存在:检查"age"键是否存在
# 5. 获取所有键:打印所有键名
初始化 dict() Constructor¶
From keywords args¶
thisdict = dict(name = "John", age = 36, country = "Norway")
print(thisdict)
From key-value pairs separated by comma¶
d = {
<key>: <value>,
<key>: <value>,
.
<key>: <value>
}
From lists of key-value tuples¶
d = dict([
(<key>, <value>),
(<key>, <value),
.
(<key>, <value>)
])
[problem04] 有列表记录 students = [("zhang", 103), ("li", 101), (“wang”, 102)] ,使用以上三种方法进行初始化
字典遍历¶
loop by key¶
for key in dict:
print(key)
loop by values¶
for value in dict.values():
print(value)
loop by (key, value)¶
for key, value in dict.items():
print(key, value)
练习: 用上面3种语法打印 students 字典的所有键、值,以及键值对。
[problem05]
student_info = {"name": "li", "id": 101, "score": 88, "class": "B班"}
# 1. 遍历所有键并打印
# 2. 遍历所有值并打印
# 3. 遍历所有键值对并格式化输出:"姓名: li, 学号: 101"
综合练习¶
复杂功能 dict¶
[problem06]
有列表记录 students = [("zhang", 103), ("li", 101), (“wang”, 102), ...],其中每条记录的第一个字段是姓名,第二个字段是学号。要求:
创建字典,能由学生的姓名查出其学号
创建字典,能由学生学号查出其姓名
创建一个由字典组成的列表,能够通过
stu[1]['name']可以取出学生的姓名"li",能通过stu[2]['id']取出学生的学号102(选做)创建一个对象,能由其姓名或学号均能查出和修取其中的成员